我正在编写一个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),..]
有什么建议吗?
答案 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)