python - DRF 中嵌套序列化器缺少上下文

标签 python django serialization django-rest-framework

我遇到了一个奇怪的问题,我的一个序列化程序无法获取上下文,因此失败。

首先,在 View 集上,我实现了一个列表方法,在该方法中,我根据一些依赖于模型中嵌套关系的条件来过滤订单。

class OrdersInAgendaViewSet(OrderMixin, viewsets.ReadOnlyModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderInAgendaSerializer
    permission_classes = (
        CanManageOrder,
    )

    def list(self, request):
        final_orders = set()
        qs = super(OrdersInAgendaViewSet, self).get_queryset()
        # Get only orders that have lines with products that have no rentals objects
        for order in qs:
            accommodations = False
            lines = order.lines.all()
            for line in lines:
                if line.product.rental:
                    accommodations = True
                    break
            if not accommodations:
                final_orders.add(order.pk)
        qs = qs.filter(pk__in=final_orders)
        serializer = self.serializer_class(qs, many=True)
        return Response(serializer.data)

现在是这个 ViewSet 的主序列化器

class OrderInAgendaSerializer(serializers.ModelSerializer):
    lines = LineForAgendaSerializer(many=True, read_only=True)
    customer = CustomerInOrderSerializer(many=False, read_only=False)
    notes = OrderNoteSerializer(many=True, read_only=True)

    class Meta:
        model = Order
        fields = (
            'id',
            'date_placed',
            'status',
            'payment_status',
            'email_billing',
            'notes',
            'customer',
            'lines',
        )
        extra_kwargs = {'date_placed': {'required': False}}

正如您所看到的,我在这个序列化器上使用了另外 3 个序列化器,失败的是 LineForAgendaSerializer:

class LineForAgendaSerializer(serializers.ModelSerializer):
    product = ProductForAgendaSerializer(many=False, read_only=True)
    customers = serializers.SerializerMethodField()

    class Meta:
        model = Line
        fields = (
            'starting_date',
            'ending_date',
            'product',
            'customers',
            'rents',
        )

    def get_customers(self, obj):
        customers = obj.customerinline_set.all()
        session_filter = self.context['request']\
            .query_params.get('session', None)

        if session_filter is not None:
            customers = customers.filter(
                sessions__id=session_filter).distinct()

        serializer = CustomerInLineForAgendaSerializer(customers, many=True, context=self.context)
        return serializer.data

有问题的行位于 get_customers 方法中:

session_filter = self.context['request']\
            .query_params.get('session', None)

检查 self.context 是空的,所以我总是收到 KeyError...

如何将上下文传递给这个序列化器...应该从 Viewset 完成(如果是的话怎么做?)还是从 OrderInAgendaSerializer 完成(又如何?)

谢谢

最佳答案

是的,您应该从 View 集中传递上下文。

在这一行:

serializer = self.serializer_class(qs, many=True, context={your context})

或者,您可以使用应该有效的 self.get_serializer() 方法。

关于python - DRF 中嵌套序列化器缺少上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40283703/

相关文章:

python - GDALWarp 返回 NULL 且未设置错误

django - 如何使用 Django ORM 删除 id 最小的行?

python - Django 错误 - 使用参数 'password_reset_confirm' 和关键字参数 ' 反转 '()'

java - 如何在Java中序列化不可序列化的对象?

python - 用 dill 序列化 SWIG 扩展

python - 在 django get/filter 查询中,参数的顺序重要吗?

python - 如何正确分组列?

python - 有条件地替换丢失的数据 pandas

python - 模型中 django dateTime 的正确格式是什么?

.net - 如何将引用的对象展平为引用者上的两个 json.net 属性?