python - Django Queryset 使用 .extra 查询多对多关系

标签 python mysql sql django

所以我试图过滤一个大型数据库,发现我需要一个复杂的 WHERE 子句来真正完成我需要的搜索。不幸的是我的 SQL 知识非常缺乏,所以我希望有人能为我指明正确的方向,以获得我想要的东西。

所以我已经弄清楚如何做如下。假设我有一个 Django 模型:

class ExampleModel(models.Model):
    param_a = models.CharField(max_length = 50)
    param_b = models.CharField(max_length = 50)
    param_c = models.CharField(max_length = 50)
    param_d = models.CharField(max_length = 50)

我希望能够搜索 param_a 等于“A”且 param_b 等于“b”或“B”的所有示例模型,因此我发现我可以使用 where 搜索:

ExampleModel.objects.extra(where=["param_a='A'", "param_b='b' OR param_b='B'"])

效果很好,这正是我想要的。但是假设我添加了另一个项目:

class ManyToManyModel(models.Model):
    name = models.CharField(max_length = 50)

并在ExampleModel中添加多对多关系:

class ExampleModel(models.Model):
    param_a = models.CharField(max_length = 50)
    param_b = models.CharField(max_length = 50)
    param_c = models.CharField(max_length = 50)
    param_d = models.CharField(max_length = 50)
    param_e = models.ManyToManyField('ManyToManyModel', related_name = 'manytomanymodel_set')

有没有办法通过.extra(where=[])方法根据这个参数进行查询?

<小时/>

更新:

所以我意识到我几乎可以通过 .filter 操作完成我想要的事情,但我还有另一个问题。

假设我想查找 param_e 具有名称为“A”的 ManyToManyModel 或名称为“B”的 ManyToManyModel 的所有示例模型,我可以使用:

ExampleModel.objects.filter(param_e__name__in = ['A', 'B'])

但我现在不明白的一件事是如何找到名称为“A”AND“B”的名称。例如,假设 param_e 在多对多字段中有四个 ManyToManyModel,名称分别为“A”、“B”、“C”和“D”。搜索完全匹配很容易,但是要查找包含“A”和“B”以及其他任何内容的所有示例模型,是否有过滤器?我似乎在 Django 文档中找不到它。

最佳答案

看这里:https://docs.djangoproject.com/en/1.6/topics/db/queries/#complex-lookups-with-q-objects

在应用于查询集之前,可以使用 OR 或 AND 等逻辑操作来组合这些 Q 对象。

关于python - Django Queryset 使用 .extra 查询多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24917293/

相关文章:

python - 行的 Pandas 最大值,前 n 最大值

python - 如何扫描 pandas 行中的第一个非零值并使用数字创建新列

php - 在 MySQL 中包含 $variable

python - 减少 py2exe 可执行文件的大小

python - 在 Ubuntu 上构建原生 webrtc

MySQL 哈希数据库

Mysql 查询 - round() 函数

php - 解析错误 : syntax error, 意外的 T_IF

sql - 使用 PostgreSQL 中的约束索引用于 ORDER BY 的列

sql - 是否有可能获得删除行的 SQL 查询?