我在 Django 中有一個模型,其中一個欄位與教師模型有 fk 關系。我在 django 中遇到了 select_related 并想在我看來使用它。但是,我不確定是否在我的查詢中使用它。
我的模型:
class Teacher(models.Model):
name = models.OneToOneField(max_length=255, default="", blank=True)
address = models.CharField(max_length=255, default="", blank=True)
college_name = models.CharField(max_length=255, default="", blank=True)
class OnlineClass(models.Model):
teacher = models.ForeignKey(Teacher,on_delete=models.CASCADE)
我的看法:
def get(self, request,*args, **kwargs):
teacher = self.request.user.teacher
classes = Class.objects.filter(teacher=teacher) #confusion is here..............
serializer_class = self.get_serializer_class()
serializer = serializer_class(classes,many=True)
return Response(serializer.data,status=status.HTTP_200_OK)
我已經評論了問題的行或部分。所以我想列出那個老師的所有課程。在這里我使用了過濾器。但是我們可以在這里使用 select_related 嗎?我的理解是,如果我還想顯示教師模型的另一個領域,例如姓名或大學名稱,那么我必須使用它。否則我這樣做的方式是正確的。另外,select_related 只用于 get api 而不是 post api,對嗎??
uj5u.com熱心網友回復:
首先,獲取每位教師所有課程的最簡單方法是使用related_name attribute( https://docs.djangoproject.com/en/3.2/ref/models/fields/#django.db.models.ForeignKey.related_name )。
class OnlineClass(models.Model):
teacher = models.ForeignKey(
Teacher,
on_delete=models.CASCADE,
related_name='classes'
)
# All classes of a teacher
teacher.classes.all()
當select_related被使用,新的SQL連接被添加到Django的內部SQL查詢。減少資料庫引擎的作業量,快速獲取資料很有用,是的,只是為了讀取。
for obj in OnlineClass.objects.all():
# This hits the database every cycle to get the teacher data,
# with a new query like: select * from teacher_table where id = ...
print(obj.teacher)
for obj in OnlineClass.objects.select_related('teacher').all():
# This don'ts hits the database.
# Previously, the Django ORM joined the
# OnlineClass and Teacher data with a single SQL query.
print(obj.teacher)
我認為,在你的例子中,只有一位老師,使用“select_related”與否沒有太大區別。
uj5u.com熱心網友回復:
select_related用于在執行查詢時從相關物件中選擇附加資料。這會導致更復雜的查詢。但是如果您必須訪問相關資料,它會提高性能,因為不需要額外的資料庫查詢。
請參閱此處的檔案。
在您的代碼中,可以使用select_related,但效率低下,因為您沒有訪問查詢類的相關物件。因此,使用select_related會導致更復雜的查詢而沒有任何優勢。
如果你想使用select_related,語法將是classes = Class.objects.select_related('teacher').filter(teacher=teacher)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/346216.html
標籤:姜戈 接口 Django 休息框架 django-views django 选择相关
