簡體   English   中英

django的get_or_create方法總是產生新記錄

[英]django get_or_create method always results in a new record

模型

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。

至少此dateUpdated=datetime.now()會使get_or_create始終創建新記錄,因為每次datetime.now()都不相同。

我相信我使用的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()

除了@ user1865366答案外, projects.objects.get應該用try ... except ...括起來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無法獲取對象時將出現大錯誤屏幕

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM