【发布时间】:2017-03-17 06:22:32
【问题描述】:
更新对象中的外键后,相关对象不会刷新。
模型.py:
class Name(models.Model):
name = models.CharField(max_length=30, unique=True)
status = models.ForeignKey( 'NameStatus' )
class NameStatus(models.Model):
status = models.CharField(max_length=30, unique=True)
测试它:
>>> name_obj = Name.objects.exclude(name="Foo").get()
>>> print ( status.status.id )
2
>>> name_obj.status_id = status.status.id + 1
>>> print ( "%d vs %d" % (status.status.id, status.status_id )
2 vs 3
样本数据:
姓名:
| id | name | status (status_id) |
----------------------------------
| 1 | Foo | 2 |
| 2 | Bar | 3 |
状态:
| id | status |
----------------------
| 1 | First Status |
| 2 | Second Status |
| 3 | Third Status |
我错过了什么?
是否应该在刷新对象的查询设置中再次调用 .get()?
我知道这可能是为了减少对数据库的不必要调用,但是如何避免呢?
有了这个示例数据,我如何在 Django orm 中将外键从 Second Status 移动到 Third Status。
PS:正如下面的一些答案试图争辩说 field_id 属性不存在或者它会创建一个新的对象属性。这个不对。它在调试器下进行了测试,并且 save() 确实在数据库中反映了它。 _id 文档参考为:https://docs.djangoproject.com/en/1.10/ref/models/fields/#database-representation
编辑:将状态对象更改为名称以反映类权限。添加了示例数据。
【问题讨论】:
-
为什么要添加一个新的键 status_id 来命名对象(因为模型中没有定义相同的字段)?
-
因为 Django 是这样命名数据库中 Name 表中的 status 字段的:status_id。这是处理它的错误方式(tm)吗?
-
首先你的对象命名约定有问题。
-
已按照您的建议进行编辑以反映对象名称。