快速过滤django中的相关字段

时间:2016-12-23 00:24:11

标签: python django postgresql

我的django项目中有2个模型。

ModelA(models.Model):
    id = models.AutoField(primary_key=True)
    field1 = ...
    ~
    fieldN = ...

ModelB(models.Model):
    id = models.AutoField(primary_key=True)

    a = models.ForeignKey(A, on_delete=models.CASCADE)

    field1 = ...
    ~
    fieldN = ...

这里我有一对一的关系A-> B。表A有大约30个不同的字段和10.000+行,表B有大约15和10.000.000+行。我需要首先按几个ModelA字段进行过滤,然后为每个过滤的ModelA行/对象获取相关的ModelB对象,并按几个字段过滤它们。之后我需要在JSON中序列化它们,其中所有ModelB在一个字段中打包为数组。

是否可以在1-3秒左右执行此操作?如果是,最好的方法是什么?

我使用PostgreSQL。

修改

现在,我在简单的.filter()字段上执行链接ModelA,然后对结果QuerySet进行迭代,并为每个ModelB实例获取ModelA的集合,但我怀疑,这个解决方案的第二部分将减慢整个过程,所以我想有一个更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

执行这样的查询可能会更快:

model_a_queryset = ModelA.objects.filter(field=whatever)
model_b_queryset = ModelB.objects.filter(a__in=model_a_queryset)

因为Django执行了懒惰的查询集评估,所以这只会导致一次命中数据库。

另外,您无需在模型上定义id = Autofield字段。 Django默认包含它们。