django get_or_create方法总是会产生新记录

时间:2014-03-06 05:59:57

标签: python django

模型

class projects(models.Model):
"""Table that holds the details of the projects."""


    toiName =  models.CharField(max_length=100)
    toiOwner =  models.CharField(max_length=50)
    receiver = models.CharField(max_length=50)
    manager = models.CharField(max_length=50)
    toiOwnerEmail =  models.EmailField(max_length=70)
    receiverEmail = models.EmailField(max_length=70)
    managerEmail = models.EmailField(max_length=70)
    dateUpdated= models.DateTimeField(default=datetime.today())
    dateCreated = models.DateTimeField(default=datetime.today())

    class Meta:
        db_table="projects"

查看,保存模型的原始代码工作正常,当我继续编辑视图中的表单时,我总是以新记录结束。

    data = model_to_dict(projects.objects.filter(toiName=pid, managerEmail=request.user)[0])
    if request.method == 'POST':
        form = projectsForm(request.POST)
        if form.is_valid():
            #form = projectsForm(request.POST, instance=projects.objects.get(toiName=pid))
            #obj = projects\
            obj, created = projects.objects.get_or_create\
                                (toiName=request.POST['toiName'],
                                toiOwnerEmail=request.POST['toiOwnerEmail'],
                                toiOwner=request.POST['toiOwner'],
                                manager=request.POST['manager'],
                                receiver=request.POST['receiver'],
                                receiverEmail=request.POST['receiverEmail'],
                                dateUpdated=datetime.now(),
                                dateCreated=data['dateCreated'],
                                managerEmail=request.user,)

此处创建的结果始终为True。

3 个答案:

答案 0 :(得分:2)

至少此dateUpdated=datetime.now()会导致get_or_create始终创建新记录,因为每次datetime.now()都不同。

答案 1 :(得分:0)

我认为我错误地使用了get_or_create,因为我只是尝试更新条目。

我修改了视图中的代码:

    data = model_to_dict(projects.objects.filter(toiName=pid, managerEmail=request.user)[0])
proj =  projects.objects.get(toiName=pid, managerEmail=request.user)
if request.method == 'POST':
    form = projectsForm(request.POST)
    if form.is_valid():
        proj.toiName=form.cleaned_data['toiName']
        proj.toiOwnerEmail=form.cleaned_data['toiOwnerEmail']
        proj.toiOwner=form.cleaned_data['toiOwner']
        proj.manager=form.cleaned_data['manager']
        proj.receiver=form.cleaned_data['receiver']
        proj.receiverEmail=form.cleaned_data['receiverEmail']
        proj.dateUpdated=datetime.now()
        #proj.dateCreated=data['dateCreated']
        proj.save()

答案 2 :(得分:-1)

@ user1865366答案的附加内容,projects.objects.get应该与try ... except ...一起包含,如此

try:
    proj = Projects.objects.get(toiName=pid,manageEmail=request.user)
except Projects.DoesNotExist :
    # do something create new proj and do something with the form
    ...

否则当django无法获取对象时会出现大错误屏幕