Django rest framework 如何使用反向相关模型中的字段序列化-Django rest框架
我有一个api,它通过带有额外订单字段的多个模型检索与项目相关的所有项。我现在正尝试序列化带有订单值的项目 一种解决方案是通过模型序列化,但结果如下:Django rest framework 如何使用反向相关模型中的字段序列化-Django rest框架,django-rest-framework,Django Rest Framework,我有一个api,它通过带有额外订单字段的多个模型检索与项目相关的所有项。我现在正尝试序列化带有订单值的项目 一种解决方案是通过模型序列化,但结果如下: { "order": 1, "item": { "id": 3031, "name": "Miami" } }, 我希望序列化该项,并获得如下输出: { "order": 1, "id": 3031, "name": "Miami" } 我无法将订单作为属性添加到
{
"order": 1,
"item": {
"id": 3031,
"name": "Miami"
}
},
我希望序列化该项,并获得如下输出:
{
"order": 1,
"id": 3031,
"name": "Miami"
}
我无法将订单作为属性添加到项目模型中,因为它是一个多个字段。或者,我想我可以,但必须使用列表的第一个对象,我认为这不是一个非常干净的解决方案,可能会添加一个单独的数据库调用
所有项目都是这样取的:
ProjectItem.objects.filter(project_id=self.kwargs['project_pk']).select_related('item')
有什么想法吗?如果您有一个直通模型,那么您应该将其序列化,并使用
源
额外参数“展平”表示
例如,对于name
,它将是
name = serializers.CharField(source='item.name')
您可能必须编写序列化程序创建/更新方法,以使其可写。如果您有一个直通模型,那么您应该序列化它,并使用
源
额外参数“展平”表示
例如,对于name
,它将是
name = serializers.CharField(source='item.name')
您可能必须编写序列化器创建/更新方法,以使其可写。如果出于某种原因不想像@Linovia建议的那样遍历直通模型,那么您可以预取直通模型,并使用带有覆盖到\u表示的RelatedField 这就是我所做的:
from django.db.models import Prefetch
Item.objects.filter(projectitem_set__project_id=self.kwargs['project_pk'])
.prefetch_related(
Prefetch('projectitem_set', queryset=ProjectItem.objects.filter(project_id=self.kwargs['project_pk']), to_attr='order'))
然后将其添加到ItemSerializer(不要添加many=True):
并覆盖ProjectItemSerializer中的to_表示:
class ProjectItemSerializer(serializers.RelatedField):
def to_representation(self, value):
return value[0].order
值[0]获取预取值的第一个对象如果您出于某种原因不想像@Linovia建议的那样遍历直通模型,那么您可以预取直通模型并使用带有覆盖到\u表示的关联字段 这就是我所做的:
from django.db.models import Prefetch
Item.objects.filter(projectitem_set__project_id=self.kwargs['project_pk'])
.prefetch_related(
Prefetch('projectitem_set', queryset=ProjectItem.objects.filter(project_id=self.kwargs['project_pk']), to_attr='order'))
然后将其添加到ItemSerializer(不要添加many=True):
并覆盖ProjectItemSerializer中的to_表示:
class ProjectItemSerializer(serializers.RelatedField):
def to_representation(self, value):
return value[0].order
值[0]获取预取值的第一个对象好主意。正如你在我的回答中所看到的,我采用了一种稍微不同的方法。正如你在我的回答中看到的那样,我采用了一种稍微不同的方法