更新对象中的外键后,相关对象不会刷新。
model.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
编辑:将状态对象更改为name以反映Class权限。添加了样本数据。
答案 0 :(得分:0)
重写测试语句:
>>> name_obj = Name.objects.exclude(name="Foo").get()
>>> print ( name_obj.status.id )
2
>>> name_obj.status.id = name_obj.status.id + 1
>>> print ( "%d vs %d" % (name_obj.status.id, name_obj.id)
预计ans:3 vs 2
答案 1 :(得分:0)
我相信你在这里做了两件不同的事情。
前者与后者无关,因此它们可以有不同的值
例如,你可以这样做:
from .models import Name
status = Name.objects.exclude(name="Foo").get()
status.status.foo = 'bar'
结果如下:status.status.foo会给你'bar'。