【问题标题】:Django serializers nested data reformatDjango 序列化器嵌套数据重新格式化
【发布时间】: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


【解决方案1】:

尝试一次我不确定,但请尝试一次。

class SubCourseSerializer(serializers.ModelSerializer):
 
    class Meta:
        model = subcourse
        fields = ('__all__')
class CourseSerializer(serializers.ModelSerializer):
    subcourse = SubCourseSerializer(many=True)
    class Meta:
        model = course
        fields =('id','course_name','created_by','modified_by','modified_by','modified_date','is_deleted_flag','subcourse',)

最后是 course_categories

class CourseCategoriesSerializer(serializers.ModelSerializer):
        course = CourseSerializer(many=True)
        class Meta:
            model = course_categories
            fields = ('id','category_name','created_by','created_date','modified_date','modified_by','is_deleted_flag','course',)

Python 中的类名总是以大写字母开头,我们通常不会在单词分隔中使用“_”,例如 course_categories,您应该练习命名约定。我们使用 CourseCategories 作为类名。

【讨论】:

    【解决方案2】:

    这是因为在查询中您使用课程作为参考来获取所有数据。

    fields = ('course',)
    

    或者你可以这样做

    在views.py中

    class ModelName_APIView(APIView):
    
        def get(self,request):
            model_refrence = Article.objects.filter()
            serializer = Modle_Serializer(model_refrence,many=True)
            return Response(serializer.data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 2020-04-23
      • 1970-01-01
      • 2017-12-03
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多