Django ORM不会从保存的对象刷新外键

时间:2017-03-17 06:22:33

标签: python django orm

更新对象中的外键后,相关对象不会刷新。

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权限。添加了样本数据。

2 个答案:

答案 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)

我相信你在这里做了两件不同的事情。

  • 使用status.status.id,您可以解决对象的数据库ID。
  • 使用status.status_id,您可以动态创建新的对象属性 status_id '并为其指定值3

前者与后者无关,因此它们可以有不同的值

例如,你可以这样做:

from .models import Name

status = Name.objects.exclude(name="Foo").get()
status.status.foo = 'bar' 

结果如下:status.status.foo会给你'bar'。