在仅更新模型中的一个字段时出现django错误

时间:2012-09-29 23:15:13

标签: django django-models

我想只更新模型中的一个字段。但是,我收到了一个错误。

这是我的模特:

class People(models.Model):
    name = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)

class Salary(models.Model):
    id_of_people=models.ForeignKey(People)
    salary = models.IntegerField(required=False)

在views.py

- 当我尝试更新这个时:

def update(request):
a=Salary.objects.get(id_of_people_id=1)
a.salary=500
Salary().save()

我的错误说:

IntegrityError  at/update
salary.id_of_people_id may not be NULL

和追溯表明:

Salary().save()

- 当我尝试这个时:

def update(request):
a=Salary.objects.get(id_of_people_id=1)
a.salary=500
Salary().save(save_fields=['salary'])

- 我收到此错误:

save() got an unexpected keyword argument 'save_fields'

你能帮助我更新我桌子上的一个字段吗?

2 个答案:

答案 0 :(得分:4)

在这两种情况下,您都希望在您创建的模型实例上调用save,而不是模型类 - 也就是说,您应该保存a,而不是{{ 1}}:

Salary

执行a.salary=500 a.save() 时,发生的事情是您创建一个全新的空模型实例,然后尝试将其提交到数据库,而不是提交刚刚修改过的实例。

答案 1 :(得分:0)

如果在模型中定义了ForeignKey,则将在数据库级别强制执行约束,因此在保存引用对象之前,需要使用外键保存对象引用。

您可能还想重新考虑是否应该亲自定义外键或工资。

如果你要定义这样的模型:

class Person(models.Model):
    name = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    salary = models.ForeignKey(Salary)

class Salary(models.Model):
    amount = models.IntegerField(required=False)

然后你可以定义你的视图功能,使它看起来像这样:

def update(request):
    s = Salary(amount=request.POST['salary'])
    s.save()
    p = Person(name=request.POST['name'], lastname=request.POST['lastname'], salary=s)
    p.save()

关于这一点的好处是你可以从Person实例引用薪水:

Person.objects.get(pk=1).salary.amount

我无法提出问题但是为什么你真的需要这些在不同的对象中。如果您的模型看起来像这样,事情可能会更简单:

class Person(models.Model):
    name = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    salary = models.IntegerField(required=False)