如何检查django中缓存查询列中是否存在值?

时间:2017-09-01 12:13:32

标签: python django date

我正在编写一个django应用程序,我在其中创建一个模型对象,然后最后批量创建数据。这是我的代码:

date_list = [list of dates]
data = []
for date in date_list:
     my_row = Model1.objects.get(date=date)
     if not date in data:
         data.append(Model2(user_id=my_row.user_id, date = date))
Model2.objects.bulk_create(data)

这是错误所在的位置:if not date in data:如何在列表中使用date搜索对象,如下所示:

[ Model2(date = date), Model2(date = date), Model2(date = date),..]

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您无法在date列表中找到Model2 - 它们不是同一个对象。 Q& D解决方案是使用另一个容器来存储和查找已经变化的日期 - 最好是set(),因为包容测试要快得多(O(1)而不是O(N)):

date_list = [list of dates]
data = []
date_seens = set()
for date in date_list:
     if date not in date_seens:
         data.append(Model2(date=date))
         date_seens.add(date)

但是,由于目标是不为给定日期创建多个Model2实例,因此效率更高的是将date_list本身设为set,这将保证日期从一开始就是独一无二的:

data = [Model2(date=date) for date in set(date_list)]

请注意,最后一个解决方案不会保留date_list订单,但我认为此处并不重要。

另请注意,这些都不会保证您在模型表中没有重复日期 - 我们会从date_list重复删除日期,但如果您使用相同的脚本运行相同的脚本两次 的日期(至少)每个日期有两个不同的Model2行。如果要强制模型的唯一性,则必须在数据库级别执行此操作(模型的unique=True字段具有date约束),然后{{如果您的某个日期已经在数据库中,则1}}将失败...

答案 1 :(得分:1)

你可以使用set?

date_list = [list of dates]
for date in set(date_list):
    data.append(Model2(date = date))
Model2.objects.bulk_create(data)