Django 序列化模型DRF中相关模型的字段
我有一个序列化程序,如下所示:Django 序列化模型DRF中相关模型的字段,django,django-rest-framework,Django,Django Rest Framework,我有一个序列化程序,如下所示: class ImageSerializer(serializers.HyperlinkedModelSerializer): prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(), slug_field='pk') class Meta: mo
class ImageSerializer(serializers.HyperlinkedModelSerializer):
prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
slug_field='pk')
class Meta:
model = Image
fields = (
'url',
'photo',
'prop_post',
)
这样行。现在,我的PropertyPost有一个“所有者”字段,我需要将其包含在ImageSerializer中。
我想知道我怎么能做到。我在想可能是
fields = (
'url',
'photo',
'prop_post',
'prop_post__owner'
)
但它不起作用。感谢您的帮助。
这是我的模型:
class PropertyPost(models.Model):
owner = models.ForeignKey(
get_user_model(),
related_name='posts4thisowner',
on_delete=models.CASCADE)
class CustomUser(AbstractUser):
pass
class Image(models.Model):
prop_post = models.ForeignKey(
PropertyPost,
related_name='images4thisproperty',
on_delete=models.CASCADE)
photo = models.ImageField(upload_to=upload_update_image, null=True, blank=True)
使用将完成任务的
SerializerMethodField()
。
因为你还没有发布你的模型以及它们之间的关系。
我给了你如何实现这一目标的正常想法。
如果你也能添加模型,那就更好了。
我将能够相应地更新答案
from rest_framework.serializers import SerializerMethodField
class ImageSerializer(serializers.HyperlinkedModelSerializer):
prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
slug_field='pk')
prop_post_title = SerializerMethodField()
class Meta:
model = Image
fields = [
'url',
'photo',
'prop_post',
'prop_post_title',
]
def get_prop_post_title(self, obj):
try:
return obj.prop_post.title
except:
return None
更易于使用“源”,并且可以使用用户序列化程序填充所有者字段 例如:
class ImageSerializer(serializers.HyperlinkedModelSerializer):
prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
slug_field='pk')
owner = UserSerializer(source="prop_post.owner")
class Meta:
model = Image
fields = (
'url',
'photo',
'prop_post',
'owner',
)
将您的模型添加到问题部分如果工作正常,则会添加整个所有者模型,这是一种仅显示所有者的一个字段(如
owner.email
)的方法吗?您可以使用特殊的用户序列化器仅序列化电子邮件字段。或者您可以尝试使用CharField并将source设置为仅电子邮件字段。