【发布时间】: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