gpt4 book ai didi

python - 根据行顺序在多个字段中搜索

转载 作者:太空狗 更新时间:2023-10-29 20:21:01 26 4
gpt4 key购买 nike

我有一个像下面这样的模型:

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 并与元组列表进行合并并获取要传递给 Foo.objects.filter 的 ID ()。我还尝试遍历列表并在每个元组上调用 Foo.object.get() 但它非常慢。名单相当大。

当我尝试按照当前答案的建议链接 Q 时,它抛出一个 OperationalError(SQL 变量太多)。

我的主要目标如下:

从模型中可以看出,这三个字段共同构成了我的主键。该表包含大约 15k 个条目。当我从另一个来源获取数据时,我需要检查数据是否已经在我的表中并相应地创建/更新/删除(新数据可能包含多达 15k 个条目)。有没有一种干净有效的方法来检查这些记录是否已经在我的表中?

注意:元组列表不必是那种形状。我可以修改它,将它转换成另一个数据结构或转置它。

最佳答案

你有 ('fruit', 'stuff', 'color') 字段一起唯一

因此,如果您的搜索元组是 ('Apple', 'Table', 'Blue') 并且我们将它连接起来,那么它也将是一个唯一的字符串

f = [('Apple', 'Table', 'Blue'), ('Pear', 'Phone', 'Green')]
c = [''.join(w) for w in f]
# Output: ['AppleTableBlue', 'PearPhoneGreen']

所以我们可以过滤 annotations 上的查询集 并利用 Concat

Foo.objects.annotate(u_key=Concat('fruit', 'stuff', 'color', output_field=CharField())).filter(u_key__in=c)
# Output: <QuerySet [<Foo: #0row >, <Foo: #2row>]>

This will work for tuple and list

转置大小写

案例一:

如果输入是 2 元组的列表:

[('Apple', 'Table', 'Blue'), ('Pear', 'Phone', 'Green')]

转置输入后将是:

transpose_input = [('Apple', 'Pear'), ('Table', 'Phone'), ('Blue', 'Green')]

We can easily identify by counting each_tuple_size and input_list_size that the input is transposed. so we can use zip to transpose it again and the above solution will work as expected.

if each_tuple_size == 2 and input_list_size == 3:
transpose_again = list(zip(*transpose_input))
# use *transpose_again* variable further

案例2:

如果输入是 3 元组的列表:

[('Apple', 'Table', 'Blue'), ('Pear', 'Phone', 'Green'), ('Pear', 'Book', 'Red')]

转置后输入将是:

transpose_input = [('Apple', 'Pear', 'Pear'), ('Table', 'Phone', 'Book'), ('Blue', 'Green', 'Red')]

So it is impossible to identify that the input is transposed for every n*n matrix and above solution will Fail

关于python - 根据行顺序在多个字段中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com