На самом деле все в порядке, что здесь происходит. У меня есть класс, определяемый следующим образом:Свойства 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
@outis: Он есть: 'user = models.OneToOneField (User)'. Джанго такой волшебный. – mpen