Django save()方法在使用相同id保存时,将某个字段填充为None

2024-05-15 13:53:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个型号

class Country(models.Model):

countryname = models.TextField(null=True)
countryincharge = models.ForeignKey(Employees, on_delete=models.CASCADE,null = True)
createdby = models.TextField(null=True)
createdtime = models.TextField(null=True)
modifiedby = models.TextField(null=True)
modifiedtime = models.TextField(null=True)
deletedby = models.TextField(null=True)
deletedtime = models.TextField(null=True)
isdeleted = models.IntegerField(null=True)
tenantid = models.TextField(null=True)

并创建和更新函数,如下所示

#Create
def countrycreate(request):

if request.user.is_authenticated:

    if request.method == 'POST':
        id = request.POST.get('id')

        modelwithdata = Country(
            countryname=request.POST.get('countryname'),
            countryincharge_id=request.POST.get('countryincharge'),
            createdtime = timezone.now(),
            createdby = request.user.id


        )
        if Country.objects.filter(countryname=request.POST.get('countryname')).exists():
            messages.info(request, 'Country already exists!')
            return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

        else:
            modelwithdata.save()

        return redirect('/admin/countrylistview')

 #Update
 def countryupdate(request):

if request.user.is_authenticated:

    if request.method == 'POST':
        id = request.POST.get('id')
        modelwithdata = Country(
            countryname=request.POST.get('countryname'),
            countryincharge_id=request.POST.get('countryincharge'),
            modifiedtime = timezone.now(),
            modifiedby = request.user.id
        )

        modelwithdata.id = id
        modelwithdata.save()
        return redirect('/admin/countrylistview')

问题是当创建记录时,createdtime值会按预期保存。但在运行update函数时,createdtime值设置为None。不知什么原因。其他领域运作良好。数据库是SQLite。使用DateTimeField(auto_now_add=True, null=True)DateTimeField(auto_now=True, null=True)时也会发生相同的行为


Tags: idtruegetifmodelsrequestpostcountry
2条回答

您应该使用PUTPATCH方法来更新数据,而不是POST

对于您的代码,我们也可以使用.update()

# Update

def countryupdate(request):
    if request.user.is_authenticated:
        if request.method == 'POST':
            Country.objects.filter(pk=request.POST.get('id')).update(
                countryname=request.POST.get('countryname'),
                countryincharge_id=request.POST.get('countryincharge'),
                modifiedtime = timezone.now(),
                modifiedby = request.user.id
            )
            return redirect('/admin/countrylistview')

问题是,在创建新对象时,首先获取原始对象并仅更改所需的内容

#Update
// Change this to get the object
modelwithdata = get_object_or_404(Country, pk=id)

// Change only the fields you need to
modelwithdata.countryname=request.POST.get('countryname')

modelwithdata.countryincharge_id=request.POST.get('countryincharge')
modelwithdata.modifiedtime = timezone.now()
modelwithdata.modifiedby = request.user.id

//Dont need this
//   modelwithdata.id = id
//Save the new model
modelwithdata.save()

相关问题 更多 >