您可以使用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 类定义一个新的序列化器:
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