【发布时间】:2021-05-08 19:49:49
【问题描述】:
我有一个三个模型 course_category、course 和 sub_course,它们之间有外键关系。我正在使用 DRF 序列化程序来提取嵌套数据,其中我希望 course_category 作为我的第一个父级,当然作为第二个和 subcourse 作为子级,但是当我使用 prefetch_related() 时它完全相反。
class course_categories(models.Model):
deleted_flag = [('y', 'yes'), ('n', 'no')]
category_name = models.CharField(max_length=50, unique=True)
created_by = models.CharField(max_length=50)
created_date = models.DateTimeField(auto_now_add=True)
modified_by = models.CharField(max_length=50, blank=True, null=True)
modified_date = models.DateTimeField(
auto_now_add=False, blank=True, null=True)
is_deleted_flag = models.CharField(
max_length=1, choices=deleted_flag, default='n')
def __str__(self):
return self.category_name
class courses(models.Model):
deleted_flag = [('y', 'yes'), ('n', 'no')]
course_name = models.CharField(max_length=70)
course_categories = models.ForeignKey(
'course_categories', on_delete=models.CASCADE)
created_by = models.CharField(max_length=50)
created_date = models.DateTimeField(auto_now_add=True)
modified_by = models.CharField(max_length=50, blank=True, null=True)
modified_date = models.DateTimeField(
auto_now_add=False, blank=True, null=True)
is_deleted_flag = models.CharField(
max_length=1, choices=deleted_flag, default='n')
def __str__(self):
return self.course_name
class subcourse(models.Model):
deleted_flag = [('y', 'yes'), ('n', 'no')]
subcourse_name = models.CharField(max_length=50, unique=True)
courses = models.ForeignKey(
'courses', related_name="subcourse", on_delete=models.CASCADE)
subcourse_short_description = models.CharField(max_length=150, blank=True)
created_by = models.CharField(max_length=50)
created_date = models.DateTimeField(auto_now_add=True)
modified_by = models.CharField(max_length=50, blank=True, null=True)
modified_date = models.DateTimeField(
auto_now_add=False, blank=True, null=True)
is_deleted_flag = models.CharField(
max_length=1, choices=deleted_flag, default='n')
这是我的models.py
这里还有序列化器
class CourseSerializerView(serializers.ModelSerializer):
# subcourse = SubcourseSerializerView()
class Meta:
model = courses
fields = ('__all__')
class SubcourseSerializerView(serializers.ModelSerializer):
# courses = CourseSerializerView()
class Meta:
model = subcourse
fields = ('__all__')
depth = 2
还有我的观点.py
@api_view(['GET', ])
def get_course_tree_view(request):
queryset = subcourse.objects.prefetch_related('courses')
serializer = SubcourseSerializerView(queryset, many=True)
return Response(serializer.data)
这是我的输出
[
{
"id": 1,
"subcourse_name": "Physics",
"subcourse_short_description": "this is physics",
"created_by": "narendra",
"created_date": "2021-02-02T15:02:31.817562Z",
"modified_by": null,
"modified_date": null,
"is_deleted_flag": "n",
"courses": {
"id": 1,
"course_name": "Engineering Entrance Preparation",
"created_by": "narendra",
"created_date": "2021-01-22T13:43:01.436771Z",
"modified_by": null,
"modified_date": null,
"is_deleted_flag": "n",
"course_categories": {
"id": 1,
"category_name": "Entrance Preparation",
"created_by": "narendra",
"created_date": "2021-01-22T13:31:15.284123Z",
"modified_by": null,
"modified_date": null,
"is_deleted_flag": "n"
}
}
},
{
"id": 2,
"subcourse_name": "Chemistry",
"subcourse_short_description": "this is chemistry",
"created_by": "narendra",
"created_date": "2021-02-02T15:02:52.023065Z",
"modified_by": null,
"modified_date": null,
"is_deleted_flag": "n",
"courses": {
"id": 1,
"course_name": "Engineering Entrance Preparation",
"created_by": "narendra",
"created_date": "2021-01-22T13:43:01.436771Z",
"modified_by": null,
"modified_date": null,
"is_deleted_flag": "n",
"course_categories": {
"id": 1,
"category_name": "Entrance Preparation",
"created_by": "narendra",
"created_date": "2021-01-22T13:31:15.284123Z",
"modified_by": null,
"modified_date": null,
"is_deleted_flag": "n"
}
}
}
]
但我想要的输出与我得到的输出正好相反
我知道 queryset = subcourse.objects.prefetch_related('courses') 是我应该研究的,但我是新手,我通过改组课程和子课程进行更改,但它给出了课程不'没有子课程对象
【问题讨论】:
-
回答对你有用吗?让我知道答案的评论:)
-
是的@daneilJames 它有效,但应该在课程和子课程序列化程序中包含 many=True。谢谢你:D
标签: django django-models serialization django-rest-framework django-views