这个解释可能有点长,所以请耐心等我先尝试解释我的问题,然后解释我最后尝试过的事情。我希望将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')
然而,据我所知,这会尝试传递模型本身,而不是我需要的模型实例。
感谢您花时间阅读,如果您能提供任何帮助,并指出我遇到的任何其他错误或不良做法,我将不胜感激。