【发布时间】:2021-05-08 16:22:20
【问题描述】:
我正在寻找一种方法来使用 ModelViewSet 中定义的序列化器上下文,使用 get_serializer_context 在特定 SlugRelatedField 的查询集声明中使用:
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 个!
【问题讨论】:
标签: python django-models serialization django-rest-framework drf-queryset