Django Rest Framework序列化器-多次序列化单个模型字段

时间:2019-01-06 14:09:35

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

我想在输出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字段而苦恼。如何进行?

1 个答案:

答案 0 :(得分:2)

您的方法非常接近。几个注意事项:

  1. 如果需要pk,则无需指定person整数字段,就可以免费获得(ModelSerializer将自动创建一个名为PrimaryKeyRelatedField的{​​{1}} )
  2. 您无需在此处指定person。 DRF为您提供了自动生成的内容以及在序列化程序上显式定义的字段
  3. fields默认为lookup_field
  4. 假设您的视图名称正确(我看不到您的网址),那么pk所缺少的只是一个HyperlinkRelatedField属性

将其放在一起,应该可以进行以下操作:

source

注意:对于我的urls.py,我的视图名称看起来更像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__',)