Django Rest Framework Возврат к ресурсам пользователя во вложенном сериализаторе

Я пытаюсь вернуть только ресурсы пользователя во вложенном ответе сериализатора. Мой текущий ответ выглядит следующим образом:

{
    "id": 5174,
    "resourceName": "name here",
    "moreInformation": [
        {
            "id": 15924,
            "infoName": "stuff here",
            "infoDetails": [
                {
                    "id": 51,
                    "createdBy": 1,
                    "detail": "detail here",
                    "moreInformation": 15924
                },
                {
                    "id": 52,
                    "createdBy": 3,
                    "detail": "detail here",
                    "moreInformation": 15924
                }
            ]
        }
    ]
}

Я пытаюсь сделать так, чтобы когда пользователь GET переходит на конечную точку ResourceName, то infoDetails показывал только те infoDetails, которые были createdBy у этого пользователя. Текущий ответ возвращает все infoDetails независимо от поля createdBy.

Я могу вернуть infoDetail только если id текущего пользователя совпадает с id createdBy на представлении ListInfoDetails, но не на представлении DetailResourceName. Есть ли способ сделать это на сериализаторе, или лучше сделать это в представлении?

Просмотров:

class ListInfoDetail(generics.ListCreateAPIView):
    queryset = InfoDetail.objects.all()
    serializer_class = InfoDetailSerializer

    def get_queryset(self):
        user = self.request.user
        return user.infodetail_set.all()


class DetailResourceName(generics.RetrieveAPIView):
    queryset = ResourceName.objects.all()
    serializer_class = ResourceNameDetailSerializer

Сериализаторы:

class InfoDetailSerializer(serializers.ModelSerializer):

    class Meta:
        model = InfoDetail
        fields = ['id', 'created_by', 'mnemonic_picture', 'block']


class MoreInformationSerializer(serializers.ModelSerializer):
    info_details = InfoDetailSerializer(source="infodetail_set", many=True, read_only=True)

    class Meta:
        model = MoreInformation
        fields = ['id', 'info_name', 'info_details']


class ResourceNameDetailSerializer(serializers.ModelSerializer):
    more_information = MoreInformationSerializer(many=True, read_only=True)

    class Meta:
        model = ResourceName
        fields = ['id', 'resourceName', 'more_information']

Модели:

class MoreInformation(models.Model):
    info_name = models.CharField(max_length=200, unique=True)


class InfoDetail(models.Model):
    detail = models.TextField()
    more_information = models.ForeignKey(MoreInformation, on_delete=models.CASCADE)
    created_by = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)


class ResourceName(models.Model):
    resource_name = models.CharField(max_length=200, unique=True)
    more_information = models.ManyToManyField(MoreInformation)

Попробуйте этот подход с пользовательским набором запросов на Prefetch:

from django.db.models import Prefetch


class DetailResourceName(generics.RetrieveAPIView):
    queryset = ResourceName.objects.all()
    serializer_class = ResourceNameDetailSerializer

    def get_queryset(self):
        return super().get_queryset().prefetch_related(
            Prefetch(
                "more_information__info_detail_set",
                queryset=InfoDetail.objects.filter(created_by=self.request.user),
            )
        )

Это отфильтрует все возвращаемые InfoDetail данные, основанные на текущем пользователе, от ResourceName связанных MoreInformation объектов.

Вернуться на верх