0

我有一个模型定义如下:

class Person(models.Model):
    user = models.OneToOneField(User, primary_key=True)

用户登录后,我查找用户:

user = authenticate(username=usr, password=pwd)

如何获取与该用户相关的 Person 对象?

person = Person.objects.filter(user=usr) # I guess not like this...
4

2 回答 2

0

您可以使用 Django 中的 OneToOne 关系的通用查询方法。 https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-one-relationships

从技术上讲,你可以做你写的:

person = Person.objects.filter(user=usr)

这是因为 Django 也创建了后向关系。 https://docs.djangoproject.com/en/dev/topics/db/queries/#how-are-the-backward-relationships-possible

例子,

class UserDetail(models.Model):
    # You should actually use django.contrib.auth.get_user_model()
    user = models.OneToOneField(User)
    funny_comment = models.TextField()

user = authenticate(username=usr, password=pwd)
user.userdetail # return the user detail object

我认为只有在进行自定义身份验证或只想添加几个字段时才需要自定义用户模型(在 1.5 版中)。如果要存储详细的配置文件信息,则应与用户模型建立 OneToOne 关系,并且可以像任何常规模型关系一样查询链接模型。

于 2012-11-21T19:48:16.683 回答
0

您使用的是 django v1.5 之前的版本吗?如果是这样:https ://docs.djangoproject.com/en/1.4/topics/auth/#storing-additional-information-about-users

此外,您可以创建一个简单的属性:

User.person = property(lambda u: Person.objects.get_or_create(user=u)[0])

...因此,当您要访问用户的人员属性时:

user.person.attribute_a

django 1.5 现在有自定义用户模型(使 Person 有点无关紧要)

https://docs.djangoproject.com/en/1.5/topics/auth/#customizing-the-user-model

于 2012-11-21T19:14:27.363 回答