我想在输出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
字段而苦恼。如何进行?
答案 0 :(得分:2)
您的方法非常接近。几个注意事项:
person
整数字段,就可以免费获得(ModelSerializer
将自动创建一个名为PrimaryKeyRelatedField
的{{1}} )person
。 DRF为您提供了自动生成的内容以及在序列化程序上显式定义的字段fields
默认为lookup_field
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__',)
。