现在我正在使用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的新手,所以我完全接受,如果你正确编写代码,它实际上永远不会成为问题。也就是说,出于几乎学术原因,我很想知道这个可能会如何解决。
[/编辑]
答案 0 :(得分:0)
pk
是filter()
查询中的参数,但不是字段名称。您可能想要使用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。