【问题标题】:Django one to many get all underlying recordsDjango 一对多获取所有底层记录
【发布时间】:2020-08-12 08:50:46
【问题描述】:

我正在创建一个 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'

目标是调用一个端点并返回一个包含所有组和底层过滤器的列表。有可能实现这一目标吗?如果可能,我希望它在 Serializer 类中。

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

【问题讨论】:

    标签: django django-models django-rest-framework django-serializer


    【解决方案1】:
    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
    

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

    一些补充说明

    • 类名应该是单数

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

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

    • 是 group 而不是 group_id,我们都知道在 SQL 中是 group_id,但是,这是 python,你可以访问整个 group 实例,然后你 instance.idinstance.pk 来获取它。

    【讨论】:

    • 谢谢!附加说明非常有用,我还在学习Django。但是如何从端点以 json 形式返回具有底层过滤器的组列表?
    • this
    • 我得到了它与this的合作
    • 是的,这应该是一样的,我实际上忘记了你正在使用 drf
    • 这就是我坚持使用 django 的原因,但是 drf 中的序列化程序更强大且可维护,特别是嵌套模型
    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2016-08-04
    • 2017-07-25
    • 2012-07-05
    相关资源
    最近更新 更多