【发布时间】:2018-05-08 21:47:55
【问题描述】:
我有一个类似下面的模型:
class Foo(models.Model):
fruit = models.CharField(max_length=10)
stuff = models.CharField(max_length=10)
color = models.CharField(max_length=10)
owner = models.CharField(max_length=20)
exists = models.BooleanField()
class Meta:
unique_together = (('fruit', 'stuff', 'color'), )
它填充了一些数据:
fruit stuff color owner exists
Apple Table Blue abc True
Pear Book Red xyz False
Pear Phone Green xyz False
Apple Phone Blue abc True
Pear Table Green abc True
我需要将它与集合(不是查询集)合并/加入:
[('Apple', 'Table', 'Blue'), ('Pear', 'Phone', 'Green')]
所以当我用这个元组列表搜索这个模型时,基本上应该返回第 0 行和第 2 行。
目前我的解决方法是将Foo.objects.all() 读入DataFrame 并与元组列表合并,并将ID 传递给Foo.objects.filter()。我还尝试遍历列表并在每个元组上调用Foo.object.get(),但速度非常慢。名单相当大。
当我尝试按照当前答案的建议链接 Q 时,它抛出了 OperationalError(SQL 变量太多)。
我的主要目标如下:
从模型中可以看出,这三个字段共同构成了我的主键。该表包含大约 15k 个条目。当我从另一个来源获取数据时,我需要检查数据是否已经在我的表中并相应地创建/更新/删除(新数据最多可能包含 15k 个条目)。有没有一种干净有效的方法来检查这些记录是否已经在我的表中?
注意:元组列表不必是那种形状。我可以修改它,把它变成另一个数据结构或者转置它。
【问题讨论】:
-
您使用的是哪个数据库?
-
@PaoloMelchiorre 我的试验是在 sqlite 上,但我可以切换到 postgresql。
-
你试过
Foo.objects.filter(fruit="Apple").filter(stuff="Table").filter(color="Blue")。这基本上应该为第一个查询命中数据库一次,然后在较小的搜索空间中在本地执行剩余的两个查询。
标签: python django django-queryset django-orm