如何获取manytomanyfield相关模型的所有属性的列表?

时间:2019-07-13 20:11:23

标签: django-rest-framework serializer

如何从另一个模型中获取与多体场相关的模型的属性列表?

可以说,我们有三种模型:

class Model1(models.Model):
    name=models.CharField(max_length=255)

class Model2(models.Model):
    name=models.CharField(max_length=255)

class Model3(models.Model):
    name=models.CharField(max_length=255)
    modelone=models.ForeignKey(Model1, on_delete=models.CASCADE)
    modeltwo=models.ManyToManyField(Model2)

您会看到Model3与model1具有外键关系,与model2具有ManyTomanyField关系。

现在,定义序列化器:

class Model1Serializer(serializers.ModelSerializer):
    class Meta:
        model=Model1
        fields='__all__'

class Model2Serializer(serializers.ModelSerializer):
    class Meta:
        model=Model2
        fields='__all__'

class Model3Serializer(serializers.ModelSerializer):
    class Meta:
        model=Model3
        fields='__all__'

因此,model3的当前序列化值为{'id':1,'name':'abc','modelone':2,'modeltwo':[2,3]} 我想要的是: {'id':1,'name':'abc','modelone':2,'modeltwo':[2,3],'modeltwo_names':['pqr','xyz'],'modelone_name':'mno'}

要使用modelone的名称,我们可以添加 modelone_name=serializers.CharField(source='modelone.name') 但是,我不确定对于ManyToManyField怎么做?

我尝试做: modeltwo_name=serializers.ListField(child=serializers.CharField(source='modeltwo.name')) 但是,执行上述操作给了我错误: AssertionError: The来源argument is not meaningful when applied to a子= field. Remove来源= from the field declaration.

1 个答案:

答案 0 :(得分:0)

您可以在Model2Serialize中添加Model3Serializer,其中将包含您需要的所有相关字段:

class Model3Serializer(serializers.ModelSerializer):
    modeltwo = Model2Serialize(many=True)
    modelone = Model1Serialize(many=False)
    class Meta:
        model=Model3
        fields='__all__'

输出将类似于:

{
 'id':1,
 'name':'abc',
 'modelone':{
          'id'=1,
          'name'='anyyyyy'
         },
 'modeltwo':[
         {
          'id' = 1,
          'name' = 'foo'
         },
         {
          'id' = 2,
          'name' = 'foo'
         }
       ]
}

这是文档Nested relationships。希望获得帮助。