Django Rest Framework возвращает одну модель внутри детального представления другой модели
Пытаюсь создать клон форума. Есть список досок. Каждая доска содержит список тем. Каждая тема содержит список сообщений. Я запутался в некоторых вещах
- Is the
BoardDetailview returning a list of threads the correct approach? - I'm not sure how that can be achieved.
Вот моя попытка.
views.py
class BoardDetail(generics.ListAPIView):
# what needs to be done here to return the threads belonging to a particular board?
queryset = Thread.objects.filter()
serializer_class = ThreadSerializer
models.py
class Board(models.Model):
name = models.CharField(max_length=25, primary_key=True)
created = models.DateTimeField(auto_now_add=True)
board_admin = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='board_admin')
board_moderator = models.ManyToManyField(User, related_name='board_moderator')
class Meta:
ordering = ['created']
class Thread(models.Model):
title = models.CharField(max_length=250)
created = models.DateTimeField(auto_now_add=True)
thread_admin = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='thread')
board_id = models.ForeignKey(Board, on_delete=models.CASCADE, related_name="thread")
class Meta:
ordering = ['created']
вы можете сделать это с помощью вложенных сериализаторов, вот простой пример того, как сделать эти вложенные сериализаторы.
В модели Board, родительской модели, добавьте эту функцию для получения всех потоков, связанных с определенным объектом по внешнему ключу или id.
@property
def threads(self):
return self.thread_set.all() # thread is the name of the child class
Затем в вашем классе сериализатора для Board, родительского класса добавьте поле для содержания потоков с родительским id, оно должно иметь то же имя, что и свойство, которое мы только что создали в модели Board, родительской модели, и назначили сериализатору сериализатора модели Threads, дочерней модели
threads = ThreadsSerializer(many=True, required=False)
Затем, вы должны добавить потоки в поля для сериализатора Board, родительской модели
fields = ('name','created','board_admin','board_moderator','threads')
это должно позволить вам отображать все темы, относящиеся к форуму.