我在模型中有一个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.
目前没有回答
相关问题 更多 >
编程相关推荐