Django Rest Framework - 在序列化程序中获取相关模型字段

Posted

技术标签:

【中文标题】Django Rest Framework - 在序列化程序中获取相关模型字段【英文标题】:Django Rest Framework - Get related model field in serializer 【发布时间】:2014-01-05 03:58:24 【问题描述】:

我正在尝试从 Django Rest 框架返回一个 HttpResponse,包括来自 2 个链接模型的数据。 这些模型是:

class Wine(models.Model):

    color = models.CharField(max_length=100, blank=True)
    country = models.CharField(max_length=100, blank=True)
    region = models.CharField(max_length=100, blank=True)
    appellation = models.CharField(max_length=100, blank=True)

class Bottle(models.Model):

    wine = models.ForeignKey(Wine, null=False)
    user = models.ForeignKey(User, null=False, related_name='bottles')

我想要一个包含来自相关 Wine 的信息的 Bottle 模型的序列化程序。

我试过了:

class BottleSerializer(serializers.HyperlinkedModelSerializer):
    wine = serializers.RelatedField(source='wine')

    class Meta:
        model = Bottle
        fields = ('url', 'wine.color', 'wine.country', 'user', 'date_rated', 'rating', 'comment', 'get_more')

这不起作用。

有什么想法可以做到吗?

谢谢:)

【问题讨论】:

谢谢你,我快到了。 @tom-christie 解释的内容可以获取对象本身,但我无法从 Wine 对象中获取所有字段.. 尝试将source='*' 作为RelatedField 参数。 我仍然在查询结果中得到 unicode 名称。并且在字段中尝试 wine.color 不起作用 source='*' 有什么变化? 【参考方案1】:

就这么简单,将 WineSerializer 添加为字段即可解决。

class BottleSerializer(serializers.HyperlinkedModelSerializer):
    wine = WineSerializer(source='wine')

    class Meta:
        model = Bottle
        fields = ('url', 'wine', 'user', 'date_rated', 'rating', 'comment', 'get_more')

与:

class WineSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Wine
        fields = ('id', 'url', 'color', 'country', 'region', 'appellation')

感谢@mariodev 的帮助 :)

【讨论】:

很高兴你能解决这个问题。能否请您解释一下WineSerializer class 代表什么,所以我们有一个明确的答案.. 我已经这样做了,但是在实例化序列化程序时我得到了错误HyperlinkedRelatedField requires the request in the serializer context. Add context='request': request。`。我做错了什么? 得到这样的错误:AssertionError(u"HyperlinkedIdentityField 需要在序列化程序上下文中的请求。在实例化序列化程序时添加context='request': request。",) 不是 JSON 可序列化的。 您不需要 source='wine' 参数,因为它与名称相同。事实上,如果您没有收到运行时错误,我会感到惊讶。相反,您可以添加其他参数,例如 (many=False, read_only=True) 这将在wine 属性下生成一个嵌入对象。有没有办法从***对象中直接嵌入的相关Wine模型中获取特定字段?【参考方案2】:

如果你想获取特定的字段,你可以使用序列化器字段

https://www.django-rest-framework.org/api-guide/fields/

    class BottleSerializer(serializers.HyperlinkedModelSerializer):
        winecolor = serializers.CharField(read_only=True, source="wine.color")

        class Meta:
            model = Bottle
            fields = ('url', 'winecolor', 'user', 'date_rated', 'rating', 'comment', 'get_more')

【讨论】:

对于那些花费太长时间试图弄清楚它如何链接到相关序列化程序的其他人来说,source="wine.color" 遵循模型中定义的外键关系。在本例中,外键名为“wine”,相关字段为“color”。

以上是关于Django Rest Framework - 在序列化程序中获取相关模型字段的主要内容,如果未能解决你的问题,请参考以下文章

在 django-rest-framework 中插入 django-allauth 作为端点

django使用rest_framework

Django rest framework 身份和权限验证

Django Rest Framework

Python前后端分离开发Vue+Django REST framework实战_Django REST framework框架

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers