具有外键约束的Django查询列表

时间:2018-08-16 16:16:31

标签: django python-3.x django-models

我们有许多带有外键约束的Django模型。 首先是Relation,它具有两个整数字段,它们一起形成一个唯一的组合,比方说number1和number2(以及此处不相关的其他一些字段)。 然后是RelationAddress,它对Relation具有ForeignKey约束(还有更多字段,但此处不相关)。 我们正在从外部来源获取数据,并且无法以不同的方式获取它们。

首先,我们获得一个包含“关系”数据的文件,并且可以毫无问题地导入该文件(它没有前键约束,所以很简单)。

接下来,我们得到一个包含RelationAddress数据的文件,该文件在文件的每一行上具有数字1和2(以及其他现在不再相关的数据),以便能够识别相关的Relation。如果我们天真地做到这一点,我们将逐行导入文件,并使用

这样的查询从数据库中查找相关的Relation。
Address.objects.filter(number1=given_number1, number2=given_number2)

在有很多记录的情况下(我们必须处理数百万条记录),这种方法太慢了。因此,我们尝试使用某种批处理方法,在此方法中,我们将累积1000条记录的数据,然后使用bulk_create。但是为了能够执行bulk_create,我们需要在bulk_create之前为每个RelationAddress设置外键约束,即我们需要为每个RelationAddress找到一个Relation,但是再次逐个查询该查询会使事情变得很慢。

使用列表执行此操作似乎有些复杂,因为我们有两个要查找的字段,并且重要的是number1和number2的组合,因此只需给出一堆number1值,然后再给出一堆number2值就不会'无法正常工作,因为不会检查两者的组合。

Address.objects.filter(number1__in=[list_of_given_number1] 

返回满足number1条件的地址,然后仍将执行单独的查询来满足number2条件。可能会加快速度,但肯定不够。

一种可能的方法是创建一个结合了number1和number2(例如number1_number2)的char字段,并将其设置为Relation的主键。然后,如果我们想创建一个RelationAddress,我们可以尝试使用:

relation_address = RelationAddress()
relation_address.relation = '_'.join([str(given_number1), str(given_number2)])    (this value is exactly equal to that of the primary key in the Relation table)

但是,即使提供的值与Relation中的主键的值完全匹配,也会因为抱怨我们需要提供Relation的实例而失败。我想这很有意义,但这当然是为了避免必须查询该关系。有人在这里有个更好的主意,我们可以在那里简单地设置外键约束吗?

我们还真的需要知道哪些RelationAddress行未链接到Relation。最有可能是由于不在基于number1和number2值的关系表中。因此,使用“ _”。join([str(given_number1),str(given_number2)])(再给定number_number1_number2_list)值的列表再次创建批处理,并且该查询也不太有用,因为我们不知道该列表在数据库中丢失。我们正在考虑的查询是:

Relation.objects.filter(number1_number2__in=given_number1_number2_list) 

将提供可以从列表中找到的Relations,但是列表有时包含Relation表中没有的元素,并且查询没有提供任何关于此的信息。有没有办法获取这些信息?

0 个答案:

没有答案