首页 > 解决方案 > Django rest框架序列化器 - 多次序列化单个模型字段

问题描述

我想在输出 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数据库中缺少的字段感到不满。如何进行?

标签: djangodjango-rest-frameworkdjango-serializer

解决方案


你的方法非常接近。几点注意事项:

  1. 如果你想要 pk,你不需要指定person整数字段,你可以免费获得(ModelSerializer将自动创建一个PrimaryKeyRelatedField被调用的person
  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.


推荐阅读