用户模型的外键django问题

时间:2011-05-29 01:45:35

标签: django django-models foreign-keys

我在django中有一个简单的userprofile类,以便

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()

您可以看到deletedByupdatedBy是用户类的外键字段。如果我不写related_name='%(class)s_user_update'它会给我错误(我不知道为什么)。 虽然这没有任何错误,但它不会推送deletedByupdatedBy字段的用户ID,但我会为其分配适当的用户。

可以给我任何想法并解释related_name='%(class)s_user_update'部分吗?

由于

2 个答案:

答案 0 :(得分:1)

'%(class)s_user_update'表示它是一个等待格式化的字符串。您通常会在上下文中看到它:

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

哪个会成为:

'BARGH other'

您可以在python文档中阅读有关python字符串格式的更多信息。 String Formatting Operations

我看不出你的代码会如何工作:也许你想要:

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 ,则对所有变量保持一致。特别是不要混合* snake_case *, camelCase runwordstogethersoyoucanttellwhereonestartsandthehereherends
  • 如果您有两个引用相同外键的属性,则必须告诉ORM哪一个属于反向关系。在这种情况下,它将默认为'profile_set',这将为您提供验证错误。
  • 使用'auth.User'而不是将User导入models.py文件。如果您不在User文件中的任何位置使用models.py类,那么您需要担心的重要性较低。

答案 1 :(得分:0)

您可以在此处阅读有关related_name内容的更多信息:

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