![](/img/trans.png)
[英]Django Rest Framework - Get related model field in serializer
[英]Django Rest Serializer get data related through Foreign Keys
我有以下模型骨架:
class A(models.Model):
post_id = models.ForeignKey('D')
user_id = models.ForeignKey('B')
class B(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=20, unique=True)
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
# `resource_id`
profile_photo = models.ForeignKey('C', null=True)
class C(models.Model):
user_id = models.ForeignKey('B')
name = models.CharField(max_length=60)
我想为A编写一个序列化程序,该序列化程序应从模型C返回与B相关的name
。
这里的关系就像A-> B-> C现在使用A的序列化器,我希望从C中获取数据
我想通过A访问C,即从B获取profile_photo并从C获取profile_photo的名称
我在Django Rest关系中浏览了RelatedFields,但无法实现我想要的。
是他们能实现的任何方式。
除了模型骨架中提到的以外,还有很多其他字段,我不想获取这些字段。
编辑 :我需要的最终结果是来自模型A的name
来自A的特定post_id
的所有user_id
您可以使用ModelSerializer来做到这一点 :
注意:我将假设'posts.Post'
是模型C
class CsSerializer(serializers.ModelSerializer):
class Meta:
model = C
fields = ('name')
class AsSerializer(serializers.ModelSerializer):
post_id = CsSerializer()
class Meta:
model = A
# exclude = ('field_you_dont_want_1', 'field_you_dont_want_2')
# fields = ('field_you_want_1', 'field_you_want_2')
请注意,在CsSerializer
您可以从模型C
返回所需的任何字段,在这种情况下,我只是返回name
。
如果只需要一个字符串,则可以使用StringRelatedField
class AsSerializer(serializers.ModelSerializer):
post_id = serializers.StringRelatedField(many=True)
class Meta:
model = A
此StringRelatedField
将返回C模型以__unicode__
方法返回的内容(如果是python 3.x, __str__
方法)。
编辑
现在,根据您的评论,我知道'posts.Post'
不是C
模型。 因此,您可以使用SerializerMethodField :
class AsSerializer(serializers.ModelSerializer):
c_name = serializers.SerializerMethodField()
def get_c_name(self, obj):
return obj.user_id.c_set.values('name') # this will return a list of dicts with B's related C objects.
class Meta:
model = A
编辑
您始终可以在模型中定义类方法:
class B(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=20, unique=True)
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
# `resource_id`
profile_photo = models.ForeignKey('C', null=True)
def get_profile_photo(self):
return self.profile_photo.name # This will return 'C' related object's name
因此,当您拥有A的对象时:
a_object.user_id.get_profile_photo()
或者,如果您有B的对象:
b_object.get_profile_photo()
编辑
您可以为C类定义一个新的序列化器:
class CsSerializer(serializers.Serializer):
class Meta:
model = C
然后在您的AsSerializer
class AsSerializer(serializers.ModelSerializer):
c_name = serializers.SerializerMethodField()
def get_c_name(self, obj):
qs = obj.user_id.c_set.all()
qs_serialized = CsSerializer(qs, many=True)
return qs_serialized.data
class Meta:
model = A
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.