特定の 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 が返されました!