我想只更新模型中的一个字段。但是,我收到了一个错误。
这是我的模特:
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'
你能帮助我更新我桌子上的一个字段吗?
答案 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)