我有以下模型骨架:
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返回name
,这与B有关。
这里的关系就像 A-> B-&以及c 现在使用A的串行器我希望从C
获取数据我想通过A访问C,即从B获取profile_photo,并从C获取profile_photo的名称
我按照此处Django Rest relations滚动了RelatedFields,但无法达到我想要的效果。
他们是否可以实现它。
除了模型骨架中提到的以外,还有很多字段,我不想取这些字段。
修改:
我需要的最终结果是来自A的特定user_id
的所有post_id
和来自模型C的name
答案 0 :(得分:1)
您可以使用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__
方法(__str__
方法中返回的内容,如果是python 3.x)。
修改强>
现在,根据您的评论,我知道'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类定义一个新的Serializer:
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