0

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

4

2 に答える 2