python - Django - 将两个模型序列化器合并为一个 JSON 响应

标签 python django django-rest-framework

我有两个模型列表和卡片。我正在尝试将这两者结合起来并生成一个 JSON 响应

我的列表 JSON 响应

[
    {
        "id": 1,
        "name": "List of things to do"
    },
    {
        "id": 2,
        "name": "one more"
    }
] 

我的卡 JSON 响应

[
    {
        "id": 1,
        "title": "My first scrum card",
        "description": "list things todo here",
        "story_points": null,
        "business_value": null,
        "list": 1
    },
    {
        "id": 2,
        "title": "File my taxes",
        "description": "fill it before 1st of nov",
        "story_points": null,
        "business_value": null,
        "list": 1
    },
]

我的serializers.py文件

from rest_framework import serializers
from .models import List, Card

class CardSerializer(serializers.ModelSerializer):

    class Meta:
        model = Card
        fields = '__all__'

class ListSerializer(serializers.ModelSerializer):
    cards = CardSerializer(read_only=True, many=True)

    class Meta:
        model = List
        fields ='__all__'

我的api.py文件

from rest_framework.viewsets import ModelViewSet
from .models import List, Card
from .serializers import ListSerializer, CardSerializer

class ListViewSet(ModelViewSet):
    queryset = List.objects.all()
    serializer_class = ListSerializer

class CardViewSet(ModelViewSet):
    queryset = Card.objects.all()
    serializer_class = CardSerializer

我的models.py

from django.db import models

class  List(models.Model):
    name = models.CharField(max_length=50) 

    def __str__(self):
        return "List : {}".format(self.name)

class Card(models.Model): # to create card table
    title = models.CharField(max_length=100)
    description = models.TextField(blank=True) 
    list = models.ForeignKey(List, related_name = "card" 
    ,on_delete=models.PROTECT) # creating a foriegn key for storing list
    story_points = models.IntegerField(null=True, blank = True)
    business_value = models.IntegerField(null=True, blank = True)
    def __str__(self):
        return "Card : {}".format(self.title)

如何在“我的列表”JSON 响应中实现类似以下内容?

[
    {
        "id": 1,
        "cards":[
        {
            "id": 1,
            "title": "My first scrum card",
            "description": "list things todo here",
            "story_points": null,
            "business_value": null,
            "list": 1
        }],
        "name": "List of things to do"
    },
    {
        "id": 2,
        "cards":[
        {
            "id": 2,
            "title": "File my taxes",
            "description": "fill it before 1st of nov",
            "story_points": null,
            "business_value": null,
            "list": 1
        }],
        "name": "one more"
    },
]

我尝试过这样做,但无法实现。所以我把它贴在这里。

标题

非常感谢。

最佳答案

您还可以使用 SerializerMethodeField https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield .

class ListSerializer(serializers.ModelSerializer):
    cards = serializers.SerializerMethodField()

    class Meta:
       model = List
       fields = '__all__'

   def get_cards(self, obj):
       data = CardSerializer(obj.card.all(), many=True).data
       return data

关于python - Django - 将两个模型序列化器合并为一个 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52933229/

相关文章:

python - 如何使用 Flask 将帖子中的 url 替换为指向该 url 的链接?

python - 使用 pyinstaller 编译 celery worker

python从列表中选择特定元素

python - Django 嵌套 Transaction.atomic

Django - 将 Django Rest Swagger 架构添加到带有 `@api_view` 的 DRF 标记函数

python - Django rest framework Router - 如何添加自定义 URL 和 View 功能

python - 使用自然键排除 Django 转储数据中的主键

python - Django模型保存self.field.rel.to.DoesNotExist

python - Django 查询日期时间不正确?

python - 如何重写 Django Rest Framework View 集 Perform_create() 方法来为字段设置默认值