Создание и вывод информации views.py DRF
Есть объект "книга" под которой есть комментарии пользователей.
models.py
class Books(models.Model):
name = models.CharField(max_length=100)
author = models.ManyToManyField(Authors, related_name='authors',)
genre = models.ManyToManyField(Genres, related_name='genres',)
info = models.TextField(max_length=1000, blank=True)
publisher = models.ForeignKey(Publishers, related_name='publisher',
on_delete=models.SET_DEFAULT, default=1)
def __str__(self):
return self.name
class Comments(models.Model):
book = models.ForeignKey(Books, on_delete=models.CASCADE, related_name='comments_book')
user = models.ForeignKey(User, on_delete=models.COSCADE)
text = models.TextField(max_length=1000)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '{}: {}'.format(self.user, self.text)
serializers.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Books
fields = ['name', 'author']
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comments
fields = ['user', 'text', 'date', 'book']
class BookDetailSerializer(serializers.ModelSerializer):
comments = CommentSerializer(many=True, source='comments_book')
author = AuthorSerializer(many=True, read_only=True)
class Meta:
model = Books
fields = ['name', 'author', 'genre', 'publisher', 'comments']
views.py самая обычная на пока
class BookDetailView(generics.ListAPIView):
queryset = Books.objects.all()
serializer_class = BookDetailSerializer
Как реализовать, что бы данные на странице отображались одним запросом, но при том можно было отправлять POST запросы для оставления комментариев. Имею ввиду, вот что получаем на примере ниже:
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"name": "It",
"author": [
{
"id": 1,
"name": "Стивен Кинг",
"country": "USA",
"bio": null,
"image": null
}
],
"genre": [
1
],
"publisher": 1,
"comments": [
{
"user": 2,
"text": "good book",
"date": "2021",
"book": 1
},
{
"user": 1,
"text": "i realy like it",
"date": "2021",
"book": 1
}
]
}
]
т.е. на одной странице мы получаем данные и по книге и по комментариям к ней, но как создать вьюху, которая бы позволяла ещё и записывать в комментарии прям на этой же странице. Если об этом есть информация в мануале по дрф, прошу ткнуть туда пальцем. Или тут должен быть другой способ?
Ответы (1 шт):
Не знаю на сколько это корректное решение. Переопределил вьюхи через ViewSet
class BookDetailView(viewsets.ViewSet):
def list(self, request, pk=None):
queryset = Books.objects.all()
obj = get_object_or_404(queryset, pk=pk)
serializer = BookDetailSerializer(obj)
return Response(serializer.data)
def create(self, request, *args, **kwargs):
serializer = CommentSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data,
status=status.HTTP_201_CREATED,
)
Странно, что никто не мог мне хотя бы этого посоветовать.