【问题标题】:Missing context on nested serializer in DRFDRF 中的嵌套序列化程序缺少上下文
【发布时间】:2017-03-10 02:01:33
【问题描述】:

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

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

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 完成(同样,如何?)

谢谢

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

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

    在这一行:

    serializer = self.serializer_class(qs, many=True, context={你的上下文})

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

    【讨论】:

    • 随时伴侣。我已经有这个错误很多次了。第一个有效还是 get_serializer() 有效?
    • 第一个似乎足够了:)
    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多