在django orm中使用In语句

时间:2014-08-13 09:25:21

标签: python sql django

我有3张桌子说

Table1       Table2                   Category
======       =================        ==============
id, name     id, Table1_id, name      category_id, Table2_id, name

现在给出了category_id,我必须在Table1中找到属于该category_id的那些名称

我能想到的唯一解决方案就是做出这样的2个查询

similar_ids = Table2.objects.filter(category__category_id=_cat_id).values_list('id')

similar_names = Table1.objects.filter(table2__id__in=similar_ids).values_list('name').distinct()

他们是一种在单个查询中完成此操作的方法。

另外,考虑到3张表(Table1 == 30,000 rows, Table2 and Category == 125000 rows)的大小,这是正确的做法: -

  1. 一次加入所有表格进行单一查询
  2. 将其分为两部分(如上所述)

2 个答案:

答案 0 :(得分:1)

从django的角度来看,你代表模型的方式非常模糊。也就是说,在这种情况下很难使用正确的related_name。但是试试吧。你会想要:

Table1.objects.filter(table2_set__category_set__id=myid).values_list('name')

答案 1 :(得分:0)

Django不会为您的原始查询生成两个查询。如果你执行table2__id__in = similar_ids,Django将自动使用子查询。