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
объектов.