Django一对多获取所有底层记录

Django one to many get all underlying records

我正在使用包含下表的数据库创建一个 Django 应用程序:

我创建的模型如下:

class Group(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    text = models.CharField(db_column='Text', max_length=4000)

    class Meta:
        db_table = 'Group'


class Filters(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    text = models.CharField(db_column='Text', max_length=4000)
    group_id = models.ForeignKey(Group, on_delete=models.CASCADE,
                                 db_column='GroupId')

    class Meta:
        db_table = 'Filters'

目标是调用端点和 return 包含所有组和基础过滤器的列表。有可能实现这一目标吗?如果可能的话,我希望它在序列化程序 class.

我知道我可以获得过滤记录的组,但是反过来也可以吗?

class Group(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    text = models.CharField(db_column='Text', max_length=4000)

    class Meta:
        db_table = 'Group'


class Filters(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    text = models.CharField(db_column='Text', max_length=4000)
    group = models.ForeignKey(Group, on_delete=models.CASCADE,
                                 db_column='GroupId', related_name='filters') # not group_id

这只是说,过滤器有.group但是一个组有.filters(related_name),如果你没有指定related_name,默认是model_qs , 所以它应该是 filters_qs.

一些补充说明

  • Class 名字应该是单数

  • Django 通过添加 's' 创建复数名称,在你的情况下它将创建过滤器,你必须指定一个 verbose_name_plural (更多无用的代码)

  • 您不需要指定数据库数据、列名或其他任何内容,除非您要重新创建一个已经存在的后端或需要它的东西。

  • 它是组而不是 group_id,我们都知道在 SQL 中是 group_id,但是,这是 python 并且您可以访问整个组例如,然后你 instance.idinstance.pk 得到它。