gpt4 book ai didi

django - get_or_create 问题 - 导致在数据库中创建两个对象

转载 作者:行者123 更新时间:2023-11-29 11:24:03 27 4
gpt4 key购买 nike

我的 postgresql 数据库中有一个表,其中包含一个小时记录的状态。对于每个月、项目和用户,我只需要一个状态。我正在使用 get_or_create 方法来创建“状态”或检索它(如果它已经存在)。

HourRecordState.objects.get_or_create(user=request.user, project=project, month=month, year=year, defaults={'state': 0, 'modified_by': request.user})

在毫无问题地运行了大约两年之后,我偶然发现了一个问题,即我的数据库中有一个 HourRecordState 两次。现在每次调用 get_or_create 方法时都会抛出以下错误:

MultipleObjectsReturned: get() returned more than one HourRecordState -- it returned 2

我想知道为什么我的数据库中有两条相同的记录。有趣的是它们是同时创建的(秒,没有检查毫秒)。

我检查了我的代码,在整个项目中我只有一个 get_or_create 方法来创建这个对象。代码中没有其他创建方法。

如果能得到提示就好了..

更新:

几乎同时创建了对象:第一个对象:2011-10-04 11:04:35.491114+02第二个对象:2011-10-04 11:04:35.540002+02

代码:

    try:
project_id_param = int(project_id_param)
project = get_object_or_404(Project.objects, pk=project_id_param)

#check activity status of project
try:
is_active_param = project.projectclassification.is_active
except:
is_active_param = 0
if is_active_param == True:
is_active_param = 1
else:
is_active_param = 0
#show the jqgrid table and the hour record state form
sub_show_hr_flag = True
if project is not None:
hour_record_state, created = HourRecordState.objects.get_or_create(user=request.user, project=project, month=month, year=year, defaults={'state': 0, 'modified_by': request.user})
state = hour_record_state.state
manage_hour_record_state_form = ManageHourRecordsStateForm(instance=hour_record_state)

if not project_id_param is False:
work_place_query= ProjectWorkPlace.objects.filter(project=project_id_param, is_active=True)
else:
work_place_query = ProjectWorkPlace.objects.none()
work_place_dropdown = JQGridDropdownSerializer().get_dropdown_value_list_workplace(work_place_query)
except Exception, e:
project_id_param = False
project = None
request.user.message_set.create(message='Chosen project could not be found.')
return HttpResponseRedirect(reverse('my_projects'))

最佳答案

嗯,这不是您问题的确切答案,但我认为您应该更改数据库方案并改用 UNIQUE 约束来帮助您维护数据完整性,因为将强制执行唯一性在数据库级别。

如果您声明对于每个 月、用户和项目您只需要一个 状态,您的模型应该看起来像这样(使用unique_together约束):

class HourRecordState(models.Model):
user = models.ForeignKey(User)
project = models.ForeignKey(Project)
month = models.IntegerField()
year = models.IntegerField()
# other fields...

class Meta:
unique_together = ((user, project, month, year),)

因为 get_or_create 被 django 处理为 getcreate 多个进程似乎能够在特定条件下创建相同的对象两次, 但如果你使用 unique_together如果尝试,将抛出异常....

关于django - get_or_create 问题 - 导致在数据库中创建两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7652344/

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