Django rest framework serializer - 多次序列化单个模型字段
Django rest framework serializer - Serialize single model field multiple times
我想在输出中多次序列化一个相关字段 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')
我想要的:
像这样序列化我的订单模型:
{
"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
字段。如何进行?
您的方法非常接近。一些注意事项:
- 如果你想要 pk,你不需要指定
person
整数字段,你可以免费获得它(ModelSerializer
将自动创建一个名为 [=11] 的 PrimaryKeyRelatedField
=])
- 您不必在此处指定
fields
。 DRF 为您提供自动生成的字段以及序列化器上明确定义的字段
lookup_field
默认为 pk
- 假设您的视图名称是正确的(我看不到您的网址),您的
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
.
的视图名称
我想在输出中多次序列化一个相关字段 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')
我想要的:
像这样序列化我的订单模型:
{
"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
字段。如何进行?
您的方法非常接近。一些注意事项:
- 如果你想要 pk,你不需要指定
person
整数字段,你可以免费获得它(ModelSerializer
将自动创建一个名为 [=11] 的PrimaryKeyRelatedField
=]) - 您不必在此处指定
fields
。 DRF 为您提供自动生成的字段以及序列化器上明确定义的字段 lookup_field
默认为pk
- 假设您的视图名称是正确的(我看不到您的网址),您的
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
.