Django-查询过滤器,具有外来关系

Posted

技术标签:

【中文标题】Django-查询过滤器,具有外来关系【英文标题】:Django- Query filter, with a foreign relationship 【发布时间】:2017-10-05 01:31:18 【问题描述】:

我在 Django 中遇到了一个使用 mysql 数据库的查询问题,由于是新手,我无法解决。

我有 2 个模型,Area 和 Form。 一个 Area 可能有 1 个或多个 Forms 与之关联,因此它与 Forms 有外来关系:

form = models.ManyToManyField(Form)

在我的一个 Django 视图中,我想从数据库中获取所有“无区域”的表单,即不与任何区域相关联,并在模板中使用它们。

例如,如果我这样查询数据库(polls 是应用程序名称):

SELECT `polls_area_form`.`id`,
    `polls_area_form`.`area_id`,
    `polls_area_form`.`form_id`
FROM `myproject`.`polls_area_form`;

我明白了:

id area_id form_id

1 1 1

2 1 3

3 2 3

表明在此示例场景中,区域 1 与表格 1 和 3 相关联。区域 2 与表格 3 相关联。因此,由于未与任何区域相关联,因此我想在此处检索表格 2。

在我的观点中,在一个简单的情况下,无论如何有人想要检索所有表单,我只需使用 all_forms = Form.objects.filter() (Python),然后使用它来呈现我对请求的响应。

我无法确定在这种情况下应该使用什么过滤器,或者这里是否需要实际的 SQL 语句。

通过阅读 Django 文档,我觉得可能需要在过滤器后使用 .exclude(some rule),但我不知道它的规则是什么样的。

【问题讨论】:

【参考方案1】:

我认为你应该能够做到

Form.objects.filter(area=None)

假设您的区域类名为Area,并且没有添加自定义related_name

Read more here

【讨论】:

有效!其实很简单。我想我可能不得不做一些奇怪的查询。谢谢【参考方案2】:

你可以试试这个。

Form.objects.filter(area__isnull=True)

【讨论】:

因为@user6731765首先回答我给了他们复选标记,但这也有效

以上是关于Django-查询过滤器,具有外来关系的主要内容,如果未能解决你的问题,请参考以下文章

Django自递归外键过滤器查询所有孩子

Django admin 查询集通过外键向后关系过滤

从具有多对多关系 django 的两个表中过滤数据

通过具有最大列值的记录过滤 Django 查询

根据特定的多对多关系过滤 Django 查询集

django相关查询过滤器,搜索有无相关项目的项目