在Django Rest中,如何将模型指定为另一个模型的字段?

时间:2015-06-01 13:56:15

标签: python django rest serialization

这个解释可能有点长,所以请耐心等我先尝试解释我的问题,然后解释我最后尝试过的事情。我希望将API上的模型序列化为另一个模型的字段,只有第一个模型字段的子集。 (编辑:我也知道在ForeignKey s的序列化器中设置模型的可靠深度,但据我所知,您可以&# 39;省略链接模型的某个字段,或指定它仅在某些字段上进行递归)我有两个模型,一个对另一个有ForeignKey,如下所示

class ModelA(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField()
    modelb_ref = models.ForeignKey(ModelB)

class ModelB(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField()
    field1 = models.TextField()
    field2 = models.TextField()
    field3 = models.TextField()
    field4 = models.TextField()
    field5 = models.TextField()
    field6 = models.TextField()
    field7 = models.TextField()
    field8 = models.TextField()

对于这些模型,我希望API显示如下:

http://site/api/v1/ModelA

[
    {
        "id": 1
        "name": "Model A Name"
        "description": "Test of Model A"
        "modelb_ref": [
            "id": 1
            "name": "Model B"
            "description" : "Model B's description"
    }
]

你可以看到,模型B的外键链接只显示名称和描述,而不是字段1,2,3,4中的任何一个

现在,我尝试过创建ModelB的模型序列化器,如下所示:

class ModelBSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelB
        fields = ('id', 'name', 'description')

ModelA的模型序列化器,如下所示:

class ModelASerializer(serialziers.ModelSerializer):
    modelb_ref = ModelBSerializer(read_only=True)

    class Meta:
        model = ModelA
        fields = ('id', 'name', 'description', 'modelb_ref')

只要在ModelBSerializer之前定义ModelASerializer,这就可以100%正常工作,但是,由于其他原因,以及如何将mdoels的关联联系起来,这样做不是一种选择,它即使首先定义ModelASerializer也需要工作(据我所知,你不能在Python中转发声明)/

在这一点上,我将介绍一些我试图规避问题的其他事情,如果你不在乎阅读本文,并且已经知道解决方案,请忽略这一点。

然后我尝试通过将调用置于函数内来解决ModelSerializerB,因为之前在其他非django相关活动中已经有效,这给了:

class ModelASerializer(serialziers.ModelSerializer):
    modelb_ref = get_modelb_ref()

    get_modelb_ref(self):
        return ModelBSerializer(read_only=True)

    class Meta:
        model = ModelA
        fields = ('id', 'name', 'description', 'modelb_ref')

然而,这给出了get_modelb_ref尚未被宣布的问题,因此,由于我对Rest的了解很少,我试图将其设为SerializerMethodField

class ModelASerializer(serialziers.ModelSerializer):
    modelb_ref = serializers.SerializerMethodField()

    get_modelb_ref(self, obj):
        return ModelBSerializer(read_only=True)

    class Meta:
        model = ModelA
        fields = ('id', 'name', 'description', 'modelb_ref')

然而,据我所知,这会尝试传递模型本身,而不是我需要的模型实例。

感谢您花时间阅读,如果您能提供任何帮助,并指出我遇到的任何其他错误或不良做法,我将不胜感激。

0 个答案:

没有答案
相关问题