Ale*_*oVK 2 python django serialization django-rest-framework
我遇到一个奇怪的问题,我的序列化器之一无法获取上下文,因此失败。
首先,在视图集上,我实现了一个列表方法,在该方法中,我根据一些依赖于模型中嵌套关系的条件来过滤订单。
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)
Run Code Online (Sandbox Code Playgroud)
现在这个 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}}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我在这个序列化器上使用了另外 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
Run Code Online (Sandbox Code Playgroud)
有问题的行位于 get_customers 方法中:
session_filter = self.context['request']\
.query_params.get('session', None)
Run Code Online (Sandbox Code Playgroud)
检查 self.context 是空的,所以我总是收到 KeyError...
我如何将上下文传递给这个序列化器...应该从 Viewset 完成(如果是的话怎么做?)还是从 OrderInAgendaSerializer 完成(又如何?)
谢谢
是的,您应该从视图集中传递上下文。
在这一行:
序列化器 = self.serializer_class(qs, Many=True, context={你的上下文})
或者,您可以使用应该有效的 self.get_serializer() 方法。
| 归档时间: |
|
| 查看次数: |
1807 次 |
| 最近记录: |