0

我使用Django Rest框架来构建服务器部分。我有以下型号:序列化几个对象--JSON表示 - 使用数组而不是列表表示

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]}] 

这可能吗?你可以帮帮我吗?

预先感谢您!

+0

当你想要更简单的'PrimaryKeyRelatedField'时,为什么要使用嵌套表示? – Ivan

+0

@伊万,谢谢你的回答。但在这种情况下,我将获得C实体的ID。这意味着阵列中的** C.id **。但我想要** C.D_fk **(或** C.D_id **)。 –

回答

0

然后你不想嵌套序列化器。默认关系使用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访问Ç实例。

+0

感谢您的回答,但这会导致错误:'在序列化程序'B_Serializer'的字段'ManyRelatedField'中指定'source ='B_id''是多余的,因为它与字段名称相同。删除'source'关键字参数。' –

+0

对不起,我没有完成我的评论:其实你所建议的将会产生'[{“name_b”:“NAME B”,“B_id”:[1,2,3,4]}]' - In该数组是C.ID,但我需要C.D​​_id,这是表C中的字段。所以数组应该是'[130,135,145,154]' –

+0

这不是一个好主意, B ID – Linovia