【问题标题】:Django - Update model objectDjango - 更新模型对象
【发布时间】:2014-04-17 16:14:00
【问题描述】:

我的案子没有找到简单的答案,所以我来了。

这是我的模型的简化:

class People(models.Model):
    identifier = models.CharField(max_length=255, primary_key = True)
    name = models.CharField(max_length=255)
    house = model.ForeignKey(House)
    salary = model.IntegerField()

class House(models.Model):
    id = models.CharField(max_length=255, primary_key = True)
    color = models.CharField(max_length=255)

我需要更新一个人的信息。例如,假设约翰的收入很高,可以负担得起将他的房子粉刷成紫色而不是黄色。我希望能够做类似的事情:

 john = People.objects.get(identifier="john")
 john.salary = 10000
 john.house.color = "purple"
 john.house.save()
 john.save()

我想知道 Django 用什么方法来做这样的事情。现在,我遇到了一些错误,例如

john.save()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 546, in save
force_update=force_update, update_fields=update_fields)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 650, in save_base
result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 215, in _insert
return insert_query(self.model, objs, fields, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 1661, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 937, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 41, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 56, in execute
six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 54, in execute
return self.cursor.execute(query, args)
IntegrityError: duplicate key value violates unique constraint "people_pkey"
DETAIL:  Key (identifier)=("John") already exists.

当我用 save(force_update) 替换 save() 时,有时会得到一个

DatabaseError: Forced update did not affect any rows.

我读到了一些关于以下方法的内容:

john = People.objects.filter(identifier="john").update(salary=10000)

但这并没有真正的帮助,因为我还需要更新外键而不仅仅是 People 对象。 你会怎么做?

【问题讨论】:

  • “一些错误,例如...”根本没有帮助。 exact 错误是什么,回溯说明了什么?您提供的代码是正确的方法,因此错误在其他地方。
  • 用回溯编辑 :)
  • 这似乎是由于您使用这些字符域作为主键造成的。你这样做有什么特别的原因,而不是依赖 Django 的自动 ID 字段?
  • 不,我不知道为什么以前从事这个项目的人会这样做。我将其更改为 django 自动方式,我会告诉你这是否有效:)
  • 我得到一个类似的错误,我知道有:IntegrityError:重复键值违反唯一约束“people_pkey”详细信息:键(id)=(6)已经存在。

标签: python django


【解决方案1】:

这似乎是因为您手动/意外地为“人员”表中的“标识符”字段提供了主索引。如果您使用的是 phpmyadmin,请转到您的表并确保标识符不是主键。您可以通过转到关系视图来删除主索引。

【讨论】:

  • 如果我使用自动 Django 方式获取 id,我会得到同样的错误
  • 由于您已将 'primary_key=True' 设置为标识符表,因此在 'People' 表中存在值冲突。任何 django 表中的单个记录都将具有唯一的 id(除非这些表是手动处理的).. 您可以使用此 id 来查询您的 People 表中的唯一条目,而不是将“标识符”字段设置为“主键”跨度>
猜你喜欢
  • 1970-01-01
  • 2018-01-14
  • 2016-12-18
  • 2017-12-13
  • 2012-05-05
  • 2018-08-18
  • 1970-01-01
  • 2012-04-27
  • 2022-10-14
相关资源
最近更新 更多