Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Django bulk_create提供唯一约束失败:solgeo_.id_Django - Fatal编程技术网

使用Django bulk_create提供唯一约束失败:solgeo_.id

使用Django bulk_create提供唯一约束失败:solgeo_.id,django,Django,我有两种模式,即项目模式和小时模式。每当创建一个新项目时,我还希望每小时生成8760个新实例 有两种方法,一种是非常昂贵的,因为向数据库写入新行8760次,即: for i in range(0, 24): clock_time=i*3600 hourly = Hourly.objects.create(project=project, clock_time=clock_time) hourly.save() 另一种方法是使用Django bulk_create(hou

我有两种模式,即项目模式和小时模式。每当创建一个新项目时,我还希望每小时生成8760个新实例

有两种方法,一种是非常昂贵的,因为向数据库写入新行8760次,即:

for i in range(0, 24):
    clock_time=i*3600
    hourly = Hourly.objects.create(project=project, clock_time=clock_time)
    hourly.save()
另一种方法是使用Django bulk_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)

调用
hourlys.append(Hourly.objects.create(project=project,clock\u time=clock\u time))
时,数据库中已经创建了
hourlys
模型的对象,并且将该对象追加到
hourlys
列表中。该列表中的每个对象都已经有一个与其关联的
id
。因此,当您在下一行中尝试执行
bulk\u create
时,django会尝试创建具有相同id的新对象,从而导致unique约束失败

这就是我最后得到的结果,似乎效果不错。我在ProjectManager中使用bulk_create,然后为每小时模型创建一个名为create()的新类方法(@classmethod)。这就解决了Hourly没有唯一ID的问题。我不知道为什么,但它似乎工作正常

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) # "CREATED BY PROJECTMANAGER"
        project.save()

        hourlys = []
        for i in range(0, 24):
            clock_time = i*3600
            hourlys.append(Hourly.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) # One year = 31557600 seconds primary_key=True, 
    declination         = models.FloatField(default=0)
    local_civil_time    = models.FloatField(default=0)
    equation_of_time    = models.FloatField(default=0)
    solar_time          = models.FloatField(default=0)
    solar_hour_angle    = models.FloatField(default=0)

    @classmethod
    def create(cls, project, clock_time):
        hourly = cls(project=project, clock_time=clock_time)
        hourly.declination      = services.calc_declination(clock_time)
        hourly.local_civil_time = services.calc_local_civil_time(clock_time, 
                                                                 project.TMZ, 
                                                                 project.lon)
        hourly.equation_of_time = services.calc_equation_of_time(clock_time)
        hourly.solar_time       = services.calc_solar_time(hourly.local_civil_time,
                                                           hourly.equation_of_time)
        hourly.solar_hour_angle = services.calc_solar_hour_angle(hourly.solar_time)
        return hourly

@阿恩,这是错误的批量创建方式

    hourlys = []
    for i in range(0, 24):
        hourlys.append(Hourly.objects.create(project=project, 
     clock_time=clock_time))
     Hourly.objects.bulk_create(hourlys)
正确的方法是将属性传递给对象,创建该属性的列表。压缩版本如下所示

hourlys = [Hourly(project=project, clock_time=i*3600) for i in range(24)]
hourlys_objects = Hourly.objects.bulk_create(hourlys)
查看更多信息


如上所述,当您调用Hourly.objects.create时,会创建对象(对数据库的点击也会破坏使用bulk\u create优化的目的)。

但是有没有办法在使用Hourly.object.create()方法时仍然使用bulk\u create?据我所知,您不能。