gpt4 book ai didi

django - 使用Django的bulk_create给出UNIQUE约束失败:solgeo_hourly. id

转载 作者:行者123 更新时间:2023-12-02 07:02:51 24 4
gpt4 key购买 nike

我有两个模型,即“项目”和“每小时”。每当创建新项目时,我还想生成 8760 个新的 Hourly 实例。

有两种方法,一种方法成本非常高,因为有 8760 次新行写入数据库,即:

for i in range(0, 24):
clock_time=i*3600
hourly = Hourly.objects.create(project=project, clock_time=clock_time)
hourly.save()

另一种方法是使用 Djangobulk_create(hourlys) 方法,只要我使用默认的 Hourly() 构造函数,该方法就可以正常工作。不过我想使用我的自定义 Hourly.objects.create() 函数。然而,这会给 hourly.id 带来唯一的约束错误,即:

class HourlyManager(models.Manager):
""""""
def create(self, project, clock_time):
hourly = super().create(project=project, clock_time=clock_time)
hourly.local_civil_time = services.calc_local_civil_time(clock_time,
project.TMZ,
project.lon)
hourly.save()
return hourly


class ProjectManager(models.Manager):
""""""
def create(self, owner, project_name, TMZ, lat, lon):
project = super().create(owner=owner, project_name=project_name, TMZ=TMZ, lat=lat, lon=lon)
project.save()

hourlys = []
for i in range(0, 24):
hourlys.append(Hourly.objects.create(project=project, clock_time=clock_time))
Hourly.objects.bulk_create(hourlys)

return project


class Project(models.Model):
objects = ProjectManager()

owner = models.ForeignKey('auth.User', related_name='projects', on_delete=models.CASCADE)
project_name = models.CharField(max_length=200)
TMZ = models.FloatField(default=0)
lat = models.FloatField(default=0) # Radians
lon = models.FloatField(default=0) # Radians


class Hourly(models.Model):
objects = HourlyManager()

project = models.ForeignKey(Project, related_name='hourlys', on_delete=models.CASCADE)
clock_time = models.FloatField(default=0)
local_civil_time = models.FloatField(default=0)

最佳答案

@arne,这是批量创建的错误方法。

    hourlys = []
for i in range(0, 24):
hourlys.append(Hourly.objects.create(project=project,
clock_time=clock_time))
Hourly.objects.bulk_create(hourlys)

正确的方法是将属性传递给 Hourly 对象,创建一个列表。压缩版本如下所示。

hourlys = [Hourly(project=project, clock_time=i*3600) for i in range(24)]
hourlys_objects = Hourly.objects.bulk_create(hourlys)

参见link here了解更多

如上所述,当您调用 Hourly.objects.create 时,将创建对象(对数据库的命中也违背了使用bulk_create 优化的目的)。

关于django - 使用Django的bulk_create给出UNIQUE约束失败:solgeo_hourly. id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48932669/

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