Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework 如何使用反向相关模型中的字段序列化-Django rest框架_Django Rest Framework - Fatal编程技术网

Django rest framework 如何使用反向相关模型中的字段序列化-Django rest框架

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" } 我无法将订单作为属性添加到

我有一个api,它通过带有额外订单字段的多个模型检索与项目相关的所有项。我现在正尝试序列化带有订单值的项目

一种解决方案是通过模型序列化,但结果如下:

{
    "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]获取预取值的第一个对象

好主意。正如你在我的回答中所看到的,我采用了一种稍微不同的方法。正如你在我的回答中看到的那样,我采用了一种稍微不同的方法