Django Rest Framework return 一个模型在另一个模型的详细视图中

Django Rest Framework return one model inside another model's detail view

正在尝试建立一个论坛克隆。有一个板列表。每个板都包含一个线程列表。每个线程都包含一个帖子列表。我对一些事情感到困惑。

  1. 返回线程列表的 BoardDetail 视图是正确的方法吗?
  2. 我不确定如何实现。

这是我的尝试。

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模型,parent模型中,添加此功能,通过外键或id获取与某个对象相关的所有线程。

@property
def threads(self):
    return self.thread_set.all() # thread is the name of the child class

然后在你的串行器 class 中,父级 class 添加一个字段以包含具有父级 ID 的线程,它必须与我们的 属性 具有相同的名称刚刚在Board模型父模型中创建,并分配了Threads模型序列化器的序列化器子模型

threads = ThreadsSerializer(many=True, required=False)

然后,您必须在 Board 序列化器、父模型的字段中添加线程

fields = ('name','created','board_admin','board_moderator','threads')

这应该允许您显示与板相关的所有线程。