真的很困惑這裏發生了什麼。我有一個類定義如下: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