проблема django с внешним ключом для пользовательской модели - PullRequest
0 голосов
/ 29 мая 2011

У меня есть простой класс userprofile в django, такой что

class Profile(models.Model):
    user = models.OneToOneField(User,unique=True)
    gender = models.IntegerField(blank=True, default=0, choices=UserGender.USER_GENDER,db_column='usr_gender')
    education = models.IntegerField(blank=True, default=0, choices=UserEducation.USER_EDU,db_column='usr_education')
    mail_preference = models.IntegerField(blank=True, default=1, choices=UserMailPreference.USER_MAIL_PREF,db_column='usr_mail_preference')
    birthyear = models.IntegerField(blank=True, default=0,db_column='usr_birthyear')
    createdate = models.DateTimeField(default=datetime.datetime.now)
    updatedate = models.DateTimeField(default=datetime.datetime.now)
    deletedate = models.DateTimeField(blank=True,null=True)
    updatedBy = models.ForeignKey(User,unique=False,null=True, related_name='%(class)s_user_update')
    deleteBy = models.ForeignKey(User,unique=False,null=True, related_name='%(class)s_user_delete')
    activation_key = models.CharField(max_length=40)
    key_expires = models.DateTimeField()

Вы можете видеть, что deletedBy и updatedBy являются полями внешнего ключа для пользовательского класса.Если я не пишу related_name='%(class)s_user_update', это дает мне ошибку (я не знаю почему).Хотя это работает без каких-либо ошибок, оно не выдвигает идентификаторы пользователей полей deletedBy и updatedBy, хотя я назначаю им подходящего пользователя.

Может дать мне любую идею и объяснить часть related_name='%(class)s_user_update'?

Спасибо

Ответы [ 2 ]

1 голос
/ 29 мая 2011

'%(class)s_user_update' означает, что это строка, ожидающая форматирования. Обычно вы видите это в контексте:

'%(foo)s other' % {'foo': 'BARGH'} 

Что станет:

'BARGH other'

Подробнее о форматировании строк в Python вы можете прочитать в документации по Python. Операции форматирования строки

Я не вижу, как будет работать ваш код: возможно, вы хотите:

class Profile(models.Model):
    # other attributes here
    updated_by = models.ForeignKey('auth.User', null=True, related_name='profile_user_update')
    deleted_by = models.ForeignKey('auth.User', null=True, related_name='profile_user_deleted')
    # other attributes here

Если это работает, то это потому, что django делает некоторую причудливую магию за кулисами и заменяет '%(class)s' именем класса текущего класса.

Примечания к вышесказанному:

  • Последовательное использование * snake_case * для атрибутов. Если вы должны использовать camelCase , то будьте последовательны для всех переменных. Особенно не смешивайте * змея_ случай *, верблюжий корпус и запуск слова вместе с тем, что вы можете везде отправиться и отправиться туда .
  • Если у вас есть два атрибута, которые ссылаются на один и тот же внешний ключ, вы должны указать ORM, какой из них является для обратного отношения. В этом случае для обоих будет значение по умолчанию 'profile_set', что приведет к ошибке валидации.
  • Используйте 'auth.User' вместо импорта пользователя в файл models.py. Это на один импорт меньше, о чем вам нужно беспокоиться, особенно если вы не используете класс User в вашем файле models.py.
0 голосов
/ 29 мая 2011

Вы можете узнать больше о материалах related_name здесь:

https://docs.djangoproject.com/en/1.3/topics/db/queries/#following-relationships-backward

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...