我遇到了一个奇怪的问题,我的一个序列化程序无法获取上下文,因此失败。
首先,在 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/