【问题标题】:Django rest framework serializer - Serialize single model field multiple timesDjango rest框架序列化器 - 多次序列化单个模型字段
【发布时间】:2019-01-06 14:09:34
【问题描述】:

我想在输出 json 中多次序列化一个相关字段。第一个应该包含相关对象的pk,第二个表示应该是超链接。有什么花哨的方法吗?我知道SerializerMethodField,但我觉得它不优雅。

我的模型:

 class Person(models.Model):
    first_name = models.CharField()
    ...

 class Order(models.Model):
    title = models.CharField()
    person = models.ForeignKey(Person, related_name='orders')

我想要什么:

像这样序列化我的 Order 模型:

{
    "title": "Alice in wonderland",
    "person": 1,  # represents persons's primary key
    "person_url": "/person-detail/1" 
}

我尝试了什么/我的序列化程序:

class OrderSerializer(serializers.ModelSerializer):
    person = serializers.IntegerField()
    person_url = serializers.HyperlinkedRelatedField(
        view_name='myapp:user-profile',
        lookup_field='pk'
    )

    class Meta:
        model = Order
        fields = ['title', 'person', 'person_url']
        read_only_fields = ('__all__',)

但在这种情况下,Django 在逻辑上抱怨数据库中缺少 person_url 字段。如何进行?

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

    您的方法非常接近。几点说明:

    1. 如果您想要 pk,则不需要指定 person 整数字段,您可以免费获得(ModelSerializer 将自动创建一个名为 personPrimaryKeyRelatedField
    2. 您不必在此处指定fields。 DRF 为您提供自动生成的以及序列化程序上明确定义的字段
    3. lookup_field 默认为 pk
    4. 假设您的视图名称是正确的(我看不到您的网址),您的HyperlinkRelatedField 中缺少的只是一个source 属性

    把它放在一起,这样的事情应该可以工作:

    class OrderSerializer(serializers.ModelSerializer):
        person_url = serializers.HyperlinkedRelatedField(
            view_name='myapp:user-profile',
            source='person',
            read_only=True
        )
    
        class Meta:
            model = Order
            fields='__all__'
            read_only_fields = ('__all__',)
    

    注意:对于我的 urls.py,我的视图名称看起来更像 person-detail

    【讨论】:

    • 像魅力一样工作!看起来我忽略了 person 参数。
    • 不过你说得对:我错过了Meta.fields。不确定当你有read_only_fields 时是否需要显式的read_only 参数,但我添加了这些以防万一。
    • 不要被我删除的评论所迷惑。只读内容相关的失败是由我的本地无关代码引起的。
    猜你喜欢
    • 2019-10-26
    • 2018-10-14
    • 1970-01-01
    • 2016-04-07
    • 2012-11-16
    • 2018-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多