【问题标题】:Django Queryset filter equivalency to SQLDjango Queryset 过滤器等效于 SQL
【发布时间】:2020-12-24 03:14:17
【问题描述】:

对我来说,了解有关 Django ORM 内部如何使用 SQL 语言的文档并不清楚或缺少示例代码。

我的预期 SQL 是:

SELECT projects_category.id, projects_category.name, projects_project.name
FROM projects_category
    JOIN projects_project_categories
        ON projects_category.id = projects_project_categories.project_id
    JOIN projects_project
        ON projects_project_categories.project_id=projects_project.id
            WHERE NOT projects_project.is_mini ORDER BY projects_category.id;

如何在 Django ORM 或 Django 视图中做同样的事情? 我已经尝试过过滤和排除(可能使用了错误的参数......),但它似乎没有根据输出工作。除了这两个之外,可能还有更多选择。

此外,任何其他技巧都可以理解。

我的相关模型如下:

class Project(models.Model):
    name = models.CharField(max_length=100)
    is_mini = models.BooleanField(default=False)
    categories = models.ManyToManyField('Category', blank=True)

    def __str__(self):
        return self.name

class Category(models.Model): # will be used for search
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

我想获取包含非迷你项目集的类别集的查询集

【问题讨论】:

  • 您能提供与此相关的 django 模型吗?

标签: django django-queryset django-database


【解决方案1】:

为了完成这个请求,我建议按照以下方式进行:

Project.objects.values('name','categories__name','categories__id').filter(is_mini=False).order_by('id')

.values 允许您从 Project 对象中选择要选择的列。由于它与“类别”具有多对多关系,您可以使用关键字'categories__field' 访问这些类别的数据。

【讨论】:

    【解决方案2】:

    几个不同性能的例子:

    通用查询集

    Project.objects.filter(is_mini=False).order_by('categories__id')
    

    仅需要的值

    Project.objects.only("name", "categories__name", "categories__id").filter(
        is_mini=False
    ).order_by('categories__id')  
    

    预取类别 + 值

    您可以将此答案与@Midoki 的答案结合使用,并使用values 而不是only 甚至values_listDoc is here

    Project.objects.values("name", "categories__name", "categories__id").filter(
        is_mini=False
    ).prefetch_related("categories").order_by("categories__id")
    

    当您使用 ManyToMany 字段时(如果这里有很多行),您可以让 Django ORM 预取 categories 以提高性能。 Docs is here

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2018-10-09
      • 2021-05-26
      • 2014-07-13
      • 2013-09-08
      • 2011-03-04
      • 2021-06-16
      • 2016-07-21
      • 2021-05-13
      相关资源
      最近更新 更多