【问题标题】:Serializing several object - json representation - use array instead of list representation序列化几个对象 - json 表示 - 使用数组而不是列表表示
【发布时间】:2015-11-07 14:47:53
【问题描述】:

我正在使用 Django Rest 框架来构建服务器部分。我有以下型号:

class B:
    name_b = models.CharField(max_length=200)
class D:
    name_d = models.CharField(max_length=200)
class C:
    B_fk = models.ForeignKey(B, related_name='B_id')
    D_fk = models.ForeignKey(D, related_name='D_id')

这是我使用嵌套关系 (here) 的序列化程序:

class C_Serializer(serializers.ModelSerializer):
    class Meta:
        model = C
        fields = ('D_id',)
class B_Serializer(serializers.ModelSerializer):
    B_fk = C_Serializer(many=True)
    class Meta:
        model = B
        fields = ('name_b','B_id',)

我的看法:

class MyView(generics.ListCreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = B.objects.all()
    serializer_class = B_Serializer

我最后有这样的 JSON:

[{"name_b": "NAME B", "B_id": [{"D_id": 130},{"D_id": 135},{"D_id": 145},{"D_id": 154}]}]

但我想拥有

[{"name_b": "NAME B", "B_id":[130, 135, 145, 154]}]

有可能吗?你能帮帮我吗?

提前谢谢你!

【问题讨论】:

  • 当您想要更简单的PrimaryKeyRelatedField 时,为什么要使用嵌套表示?
  • @Ivan,谢谢你的回答。但在这种情况下,我将获得 C 实体的 ID。这意味着数组中的 C.id 。但我想要 C.D_fk(或 C.D_id)。

标签: arrays json python-3.x django-rest-framework django-serializer


【解决方案1】:

那么您不想要嵌套的序列化程序。默认关系使用PrimaryKeyRelatedField

class B_Serializer(serializers.ModelSerializer):
    B_id = PrimaryKeyRelatedField(many=True, source=B_id)
    class Meta:
        model = B
        fields = ('name_b','B_id',)

请注意,您的模型的 related_name 似乎是错误的,因为您需要 .B_id 才能访问 C 实例。

【讨论】:

  • 感谢您的回答,但这将导致错误:'在序列化程序'B_Serializer' 中的字段'ManyRelatedField' 上指定source='B_id' 是多余的,因为它与字段名称相同。删除 source 关键字参数。'
  • 对不起,我没有完成我的评论:实际上你的建议将导致 [{"name_b": "NAME B", "B_id":[1, 2, 3, 4]}] - 在数组中是 C.ID,但我需要 C.D_id,这是字段在表 C. 所以数组应该是[130, 135, 145, 154]
  • 在B ids的标签下返回D ids不是个好主意
  • 可能 - 我在这个领域真的很新......所以,用几个子项目(项目 C 每个都包含 FK 到 D)序列化一个父项目(B 项目)的好方法是什么)?我想要 B1 [C1,C2,C3,C4,C5]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
相关资源
最近更新 更多