我的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()返回多个HourRecordState - 它返回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'))
Run Code Online (Sandbox Code Playgroud)
这不是你的问题的确切答案,但我认为你应该改变你的数据库方案并切换到使用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),)
Run Code Online (Sandbox Code Playgroud)
因为get_or_createdjango作为一个处理,get并且create多个进程似乎能够在一定条件下创建相同的对象两次,但如果你使用unique_together异常将被抛出,如果尝试....
| 归档时间: |
|
| 查看次数: |
2158 次 |
| 最近记录: |