Django确保用户和用户配置文件具有相同的PK

时间:2013-06-14 20:04:11

标签: django django-admin

现在我正在使用Django的内置管理系统来管理用户,我使用以下内容附加了一个配置文件以包含其他数据:

class Profile(models.Model):
    user = models.OneToOneField(User, editable = False)
    # Data fields here...

当且仅当在创建用户之后立即创建配置文件时,用户和配置文件pk(以及相应的ID号)将是相同的。我可以保证在注册过程中会出现这种情况,虽然这将涵盖大多数用途,但使用管理界面创建用户可能会导致不匹配的ID出现。因此,这似乎不是一个非常强大的方法来解决这个问题,我想硬编码pk是相同的。我不知道该怎么做。

我认为以下内容可行:

profile_id = models.IntegerField(default=user.pk, editable = False, 
                                 primary_key = True)

但它给了我错误:

AttributeError: 'OneToOneField' has no attribute 'pk'

保证个人资料和用户拥有相同PK的最佳方法是什么?注意:我真的不想处理扩展基本用户模型,因为使用OneToOneField链接两者似乎足以满足我的所有需求。

谢谢!

[编辑]

我提出问题的理由是:

我当前的问题是我想要一个用户个人资料的值字典,我正在使用profile_values = Profile.objects.filter(pk=user.id).values()[0]检索。这突显了这个错误,我昨晚使用pk=user.profile.id“围攻”它。在早晨的光线下,这似乎不是一个可怕的黑客。然而,似乎有pk差异可能会导致安静,很难捕捉到错误,因此强迫他们匹配将是一个好主意。但我是Django的新手,所以我完全接受,如果你正确编写代码,它实际上永远不会成为问题。也就是说,出于几乎学术原因,我很想知道这个可能会如何解决。

[/编辑]

2 个答案:

答案 0 :(得分:0)

pkfilter()查询中的参数,但不是字段名称。您可能想要使用user.id

答案 1 :(得分:0)

就像你已经同意从来没有问题因为我们在两个模型之间有一个OneToOne映射。 因此,当您需要获取与用户对应的配置文件obj时:

profile_values = Profile.objects.get(user_id=user)

假设,

class Profile(models.Model):
    user = models.OneToOneField(User)
    ...

如果您的列名不是用户,请在get query中使用相应的名称。

如果您对如何为两个模型实现相同的pk感到好奇,那么我们可以在每次保存用户模型时设置信号。请参阅documentation

def create_profile(sender, **kwargs):
    if kwargs["created"]:
        p = Profile(user=kwargs["instance"], ...)
        p.save()
django.db.models.signals.post_save.connect(create_profile, sender=User)
每次保存任何User对象时都会调用

create_profile()。 在此函数中,只有在创建了新的User实例时才创建Profile对象。

如果我们从空白平板开始,那么我认为这将始终确保每个用户都存在一个配置文件,并在创建用户后立即创建;这反过来会为两个模型提供相同的pk。