您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

django – get_or_create问题 – 导致在DB中创建两个对象

5b51 2022/1/14 8:23:02 python 字数 4544 阅读 578 来源 www.jb51.cc/python

我的 postgresql数据库中有一个表,持有一小时记录状态.对于每个月,项目和用户我只需要一个州. 我正在使用get_or_create方法创建“状态”或检索它(如果它已经存在). HourRecordState.objects.get_or_create(user = request.user,project = project,month = month,year = year,defau

概述

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_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作为get处理的,并且创建多个进程似乎能够在某些条件下创建相同的对象两次,但是如果你使用unique_together则会在尝试时抛出异常….

总结

以上是编程之家为你收集整理的django – get_or_create问题 – 导致在DB中创建两个对象全部内容,希望文章能够帮你解决django – get_or_create问题 – 导致在DB中创建两个对象所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶