Django Rest Framework возвращает одну модель внутри детального представления другой модели

Пытаюсь создать клон форума. Есть список досок. Каждая доска содержит список тем. Каждая тема содержит список сообщений. Я запутался в некоторых вещах

  1. Is the BoardDetail view returning a list of threads the correct approach?
  2. 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')

это должно позволить вам отображать все темы, относящиеся к форуму.

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