【问题标题】:How to serialize multiple model object?如何序列化多个模型对象?
【发布时间】:2022-11-10 02:32:02
【问题描述】:

我正在使用 Django Rest Framework 创建一个 API,它需要来自多个模型的数据。我的要求得到了很多答案,但它不起作用。

我的模型如下

class Task(models.Model):
    title = models.CharField(max_length=200)
    completed = models.BooleanField(default=False, blank=True, null=True)

    def __str__(self):
        return self.title

class Task_extended(models.Model):
    task_id = models.ForeignKey(Task, on_delete = models.CASCADE,related_name='task_extendeds')
    field_3 = models.CharField(max_length=200)
    field_5 = models.CharField(max_length=200)
    field_4 = models.BooleanField(default=False, blank=True, null=True)

    def __str__(self):
        return self.field_3

这是我的视图功能

@api_view(['GET','POST'])
def taskList(request):
    tasks = Task.objects.all()
    serializer = TaskSerializer(tasks, many =True)
    return Response(serializer.data)

序列化器.py

class TaskSerializer(serializers.ModelSerializer):
    task_extendeds = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = Task
        fields = "__all__"
        depth = 1

我得到的json如下

[
    {
        "id": 2,
        "task_extendeds": [
            1,
            2,
            3
        ],
        "title": "Start Rest Framework",
        "completed": false
    }
]

我应该对 Serializers.py 做哪些更改,以便我的 json 输出如下

[
    {
        "id": 2,
        "title": "Start Rest Framework",
        "completed": false,
        "task_extendeds": [
            {
                "field_3": "Field 3 Data",
                "field_4": "Field 4 Data",
                "field_5": "Field 5 Data"
            },
            {
                "field_3": "Field 3 Data",
                "field_4": "Field 4 Data",
                "field_5": "Field 5 Data"
            },
            {
                "field_3": "Field 3 Data",
                "field_4": "Field 4 Data",
                "field_5": "Field 5 Data"
            }
        ],
        
    }
]

元类中的 depth = 1 属性应该已经根据其他 stackoverflow 问题完成了工作,但它不起作用。

【问题讨论】:

    标签: django django-models django-rest-framework foreign-keys django-serializer


    【解决方案1】:

    您使用子序列化程序,因此:

    class Task_extendedSerializer(serializers.ModelSerializer):
        class Meta:
            model = Task_extended
            fields = ['field_3', 'field_4', 'field_5']
    
    class TaskSerializer(serializers.ModelSerializer):
        task_extendeds = Task_extendedSerializer(many=True)
        
        class Meta:
            model = Task
            fields = '__all__'

    在视图中,您可以通过预取task_extendeds 来提高效率:

    @api_view(['GET'])
    def taskList(request):
        tasks = Task.objects.prefetch_related('task_extendeds')
        serializer = TaskSerializer(tasks, many=True)
        return Response(serializer.data)

    笔记: Django 中的模型是用帕斯卡案例, 不是蛇案例, 所以你可能想重命名模型Task_extendedTaskExtended

    【讨论】:

    • 这可能会显示错误,因为序列化程序类没有 Task_extendedSerializer
    【解决方案2】:

    先写一个Task_extendedSerializer,然后在TaskSerializer中使用

    class Task_extendedSerializer(serializers.ModelSerializer):
        class Meta:
            model = Task_extended
            fields = ('field_3', 'field_4', 'field_5')
    
    
    class TaskSerializer(serializers.ModelSerializer):
        task_extendeds = Task_extendedSerializer()
        class Meta:
            model = Task
            fields = ('id', 'title', 'completed', 'task_extendeds')
    
    
    

    【讨论】:

      【解决方案3】:

      通过一个序列化器序列化多个模型的示例:

      https://medium.com/riow/how-to-serialize-multiple-models-de50859ce05b

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 2017-05-12
        • 1970-01-01
        • 2013-12-04
        • 2013-05-01
        相关资源
        最近更新 更多