Django Queryset使用.extra查询多个关系

2024-09-27 00:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图过滤一个大型数据库,发现我需要一个复杂的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)

我想能够搜索,比如说,所有的示例模型谁的参数a等于“a”,参数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\u e有一个名为“a”的ManyToManyModel,或一个名为“B”的ManyToManyModel,我可以使用:

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

但有一件事我现在搞不清楚,那就是如何找到一个名为“A”和“B”的。例如,假设paramèe在manytomy字段中有四个manytomanymodel,它们的名称分别为“A”、“B”、“C”和“D”。搜索精确匹配很容易,但是找到所有包含“A”和“B”以及其他内容的ExampleModels,是否有相应的过滤器?我在Django的文档里找不到。你知道吗


Tags: django方法name模型示例modelparammodels
2条回答

嗯,有可能。。。你知道吗

ids = ExampleModel.objects.filter(param_e__name__in = ['A', 'B']).distinct().values_list('id', flat=True)

然后:

from django.db.models import Count
ExampleModel.objects.filter(id__in=ids).annotate(match_count=Count('param_e')).filter(match_count=2)

你问它是干什么的?你知道吗

  1. 为参数名称筛选ExampleModel
  2. 只获取不同的对象
  3. Get objects id(进行另一个查询)
  4. 用ID列表过滤
  5. 使用标记项计数注释对象
  6. 再次筛选count等于2的对象,因为您只指定了两个名称(“A”和“B”)。你知道吗

我选择先获取ids,因为我在组合过滤和注释时得到了错误的结果,所以必须检查一下。你知道吗

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

在应用到queryset之前,可以使用逻辑操作(如OR和)组合这些Q对象。你知道吗

相关问题 更多 >

    热门问题