用列表d按字段筛选

2024-09-28 23:21:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在模型中有一个file字段,我想用文件名列表对其进行过滤。假设我有一个文件名["wrist_movement_eeg_no_properties.zip"](还有更多的,只是为了举例)

我尝试了Django 'objects.filter()' with list?中显示的示例,但似乎不起作用

示例

使用Q()

from django.db.models import Q

# this is the example from the above link
my_filter_qs = Q()
for creator in ["wrist_movement_eeg_no_properties.zip"]:
    my_filter_qs = my_filter_qs | Q(file=creator)

print(my_filter_qs)
a = request.user.data_storage.filter(my_filter_qs)
print(a.query)
# SELECT "data_store_datastoragemodel"."id", "data_store_datastoragemodel"."user_id", "data_store_datastoragemodel"."file_name", "data_store_datastoragemodel"."file", "data_store_datastoragemodel"."relative_path", "data_store_datastoragemodel"."file_added_datetime", "data_store_datastoragemodel"."file_updated_datetime", "data_store_datastoragemodel"."file_path" FROM "data_store_datastoragemodel" WHERE ("data_store_datastoragemodel"."user_id" = 3 AND "data_store_datastoragemodel"."file" = wrist_movement_eeg_no_properties.zip)
print(a)
# <QuerySet []>

使用__in我得到相同的输出

b = request.user.data_storage.filter(file__in=['wrist_movement_eeg_no_properties.zip'])
print(b.query)
# SELECT "data_store_datastoragemodel"."id", "data_store_datastoragemodel"."user_id", "data_store_datastoragemodel"."file_name", "data_store_datastoragemodel"."file", "data_store_datastoragemodel"."relative_path", "data_store_datastoragemodel"."file_added_datetime", "data_store_datastoragemodel"."file_updated_datetime", "data_store_datastoragemodel"."file_path" FROM "data_store_datastoragemodel" WHERE ("data_store_datastoragemodel"."user_id" = 3 AND "data_store_datastoragemodel"."file" IN (wrist_movement_eeg_no_properties.zip))
print(b)
# <QuerySet []>

但是当我使用__contains的时候,这个很好用

c = self.context['request'].user.data_storage.filter(file__contains='wrist_movement_eeg_no_properties.zip')
print(c.query)
# SELECT "data_store_datastoragemodel"."id", "data_store_datastoragemodel"."user_id", "data_store_datastoragemodel"."file_name", "data_store_datastoragemodel"."file", "data_store_datastoragemodel"."relative_path", "data_store_datastoragemodel"."file_added_datetime", "data_store_datastoragemodel"."file_updated_datetime", "data_store_datastoragemodel"."file_path" FROM "data_store_datastoragemodel" WHERE ("data_store_datastoragemodel"."user_id" = 3 AND "data_store_datastoragemodel"."file"::text LIKE %wrist\_movement\_eeg\_no\_properties.zip%)
print(c)
# <QuerySet [<DataStorageModel: DataStorageModel object (7)>]>

如果您查看第一个和第三个示例中的SQL查询,它们之间唯一的区别是wrist_movement_eeg_no_properties.zip的表示方式-"data_store_datastoragemodel"."file" = wrist_movement_eeg_no_properties.zip(第一个示例中的SQL查询的一部分)和"data_store_datastoragemodel"."file"::text LIKE %wrist\_movement\_eeg\_no\_properties.zip%(第三个示例中的SQL查询的一部分)

我检查了列表中内容的类型,结果显示它是str。我不知道第一个和第三个有什么区别,但是第一个例子不起作用

我做错什么了?如有任何解释,将不胜感激

Note that the request is the request variable from the views and I am calling the model when the user is logged in.


Tags: thestorenoiddatapropertieszipfilter