【问题标题】:Django: How to serialize a one to many relationshipDjango:如何序列化一对多关系
【发布时间】:2019-07-29 19:27:15
【问题描述】:

我似乎无法弄清楚如何在 Django 中序列化一对多关系,这些信息似乎甚至都没有出现。

我的模型

class DataInfo(models.Model):
    component_id = models.CharField(max_length=4)
    component_name = models.CharField(max_length=255)
    data_id = models.IntegerField()
    data_name = models.CharField(max_length=255)


class Data(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='data_owner')
    subject = models.CharField(max_length=255)
    init_date = models.DateField()
    fin_date = models.DateField()
    data_info = models.ForeignKey(DataInfo, related_name="datainfo", on_delete=models.CASCADE)

我的观点

class DataViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.DataSerializer

    def list(self, request):
        data = models.Data.objects.using(db_to_use).select_related('data_info').all()
        return Response(self.get_serializer(data, many=True).data)

我的序列化器

class DataInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.DataInfo
        fields = ('id', 'component_id', 'component_name', 'data_id', 'data_name')

class DataSerializer(serializers.ModelSerializer):
    datainfo = DataInfoSerializer(source="datainfo", read_only=True)
    class Meta:
        model = models.Data
        fields = ('id', 'subject', 'init_date', 'fin_date', 'owner_id', 'data_info_id', 'datainfo')

我实际上只是想在 Data 和 DataInfo 之间进行连接,在一个视图中显示 Data 和 DataInfo 的所有字段(非嵌套)。我尝试做一个select_related,放置一个源属性,似乎没有任何效果。我得到的响应只是 Data 表的所有字段,没有 DataInfo 表的字段。我在序列化过程中遗漏了什么吗?

【问题讨论】:

  • 什么是models.Conversation,它与Data有什么关系?
  • 对不起,错字,我改成了models.Data

标签: django django-rest-framework django-views django-serializer


【解决方案1】:

您是否尝试将many=True 添加到您添加DataInfoSerializer 的位置?

也就是说,

class DataSerializer(serializers.ModelSerializer):
    datainfo = DataInfoSerializer(source="datainfo", read_only=True, many=True)
    # ...

(顺便说一句,DataDataInfodata_infodatainfo 是相当糟糕的名字。特别是,related_names 应该是复数或暗示复数,除非它们在 OneToOneFields 上。 )

【讨论】:

  • 我也试过了,不过好像也没用
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2015-08-13
  • 2021-07-19
  • 2021-06-12
  • 2016-07-30
  • 2011-08-11
相关资源
最近更新 更多