【发布时间】:2010-02-08 00:33:55
【问题描述】:
真的对这里发生的事情感到困惑。我有一个类定义如下:
class Profile(models.Model):
user = models.OneToOneField(User)
primary_phone = models.CharField(max_length=20)
address = models.ForeignKey(Address)
@property
def primary_email(self): return self.user.email
@primary_email.setter
def primary_email(self, val): self.user.email = val
注意:user 有一个属性 email。
现在从命令行,我正在尝试这个:
>>> u = User.objects.get(pk=1)
>>> u.email = 'xxx'
>>> u.profile.primary_email
u'yyy'
它吐出不同的值?具体来说,u.email 的 old 值。这是怎么回事?这怎么可能?我基本上只是想为email 创建一个别名。
更多信息:
>>> id(u) == id(u.profile.user)
False
>>> u
<User: mark>
>>> u.profile.user
<User: mark>
它们似乎是user 的不同副本,但它们......什么?两者都以相同的值开头?
这样做似乎会提交更改:
>>> u.profile.primary_email = 'yyy'
>>> u.profile.user.save()
但是u.save() 不会成功,因为u != u.profile.user 无论出于何种原因。我想这回答了我的问题,但它仍然有点蹩脚。
可能这两个在 Python 中引用同一个对象,对吗?这只是 Django 中一个有趣的设计决定造成的吗?
【问题讨论】:
-
创建 User.profile 的代码在哪里?
id(u) == id(u.profile.user)? -
@outis:在那儿:
user = models.OneToOneField(User)。 Django 就是这么神奇。