我正在寻找一种使用在特定 SlugRelatedField 的查询集声明中使用的 get_serializer_context 在 ModelViewSet 中定义的序列化器上下文的方法:
class ReservationViewSet(ViewPermissionsMixin, viewsets.ModelViewSet):
serializer_class = ReservationSerializer
def get_queryset(self):
code = self.kwargs['project_code']
project= Project.objects.get(code=code)
queryset = Reservation.objects.filter(project=project)
return queryset
def get_serializer_context(self):
return {"project_code": self.kwargs['project_code'], 'request': self.request}
在所有序列化器方法中,这可以使用 self.context 访问,但我想使用上下文字典中的此信息过滤此字段的查询集:
class ReservationSerializer(serializers.ModelSerializer):
project= serializers.SlugRelatedField(slug_field='code', queryset=Project.objects.all(), required=False)
storage_location = serializers.SlugRelatedField(slug_field='description', queryset=StorageLocation.objects.filter(project__code = context['project_code'])), required=False)
这里应用到 StorageLocation (project__code = context['project_code'])的查询集是我当前的问题所在。
一些额外的上下文:这个问题是试图解决来自 rest_framework 的以下错误(StorageLocation 查询集被设置为 .all()):
projects.models.procurement.StorageLocation.MultipleObjectsReturned:get() 返回了多个 StorageLocation——它返回了 2 个!