真的很困惑这里发生了什么。我有一个类定义如下:Python属性:两个变量的实例?
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
NB:user
具有属性email
。
现在,我想这样的:
>>> u = User.objects.get(pk=1)
>>> u.email = 'xxx'
>>> u.profile.primary_email
u'yyy'
它吐出了一个不同的价值?具体来说,旧的的值为u.email
。这是怎么回事?这怎么可能?我基本上只想为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 2010-02-08 00:48:04
@outis:它在那里:'user = models.OneToOneField(User)'。 Django就像那样神奇。 – mpen 2010-02-08 02:56:42