1

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

这是我的模型:

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'

您能帮我只更新表格中的一个字段吗?

4

2 回答 2

4

在这两种情况下,您都需要调用save您创建的模型实例,而不是模型类——也就是说,您应该保存a,而不是Salary

a.salary=500
a.save()

当您这样做时Salary().save(),发生的事情是您创建了一个全新的空模型实例,然后尝试将其提交到数据库,而不是提交您刚刚修改的那个。

于 2012-09-29T23:24:18.853 回答
0

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

您可能还想重新考虑是否应该在 person 或 Salary 中定义外键。

如果您要这样定义模型:

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)
于 2012-09-29T23:56:45.820 回答