Django的get_or_create方法总是生成新记录

0 投票
3 回答
1696 浏览
提问于 2025-04-17 21:03

模型

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 个回答

-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找不到这个对象时,会出现很大的错误屏幕。

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()
3

至少这个 dateUpdated=datetime.now() 会导致 get_or_create 每次都创建新的记录,因为每次调用 datetime.now() 得到的时间都是不一样的。

撰写回答