Django:按用户配置文件或外键过滤

时间:2012-08-08 01:41:39

标签: python django

对于帐户的简单激活密钥,我必须使用随机数创建密钥,同时确保我没有使用与其他帐户相同的密钥。现在,这就是我所拥有的:

def get_random_word():
    word = ''
    i = 0
    while i in range(10) and User.objects.filter(activation_key = word).exists():
        word += random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
        i+=1
    return word

我现在意识到的问题是,我使用django内置的User类,其用户配置文件如下:

def create_user_info(sender, instance, created, **kwargs):
    if created:
        UserInfo.objects.create(user=instance)

post_save.connect(create_user_info, sender=User)


class UserInfo(models.Model):
    user = models.OneToOneField(User)
    pen_name = models.CharField(max_length=30)
    activated = models.BooleanField()
    activation_key = models.CharField(max_length=40)
    def __unicode__(self):
        return self.email + '-' + self.pen_name

我需要按用户个人资料进行过滤。因此,简而言之,我如何通过密钥或更具体地用户个人资料进行过滤。

4 个答案:

答案 0 :(得分:3)

首先,将一个related_name添加到UserInfo:

class UserInfo(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    ...

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name

然后你可以这样做:

User.objects.filter(profile__activation_key=word).exists()

希望它有所帮助:)

答案 1 :(得分:1)

我不是100%确定你想要达到的目标,但这里有两个可能符合你需求的答案:

<强>一般

首先,您需要将Django内置用户模型与UserProfile模型连接起来。这是在settings.py设置AUTH_PROFILE_MODULE设置

中完成的
AUTH_PROFILE_MODULE = 'myapp.UserProfile'    # replace `myapp` with your application name

回答1

您可以通过user.get_profile()获取特定用户的用户个人资料,假设user是已存在的django.contrib.auth.User实例。

回答2

您可以首先通过您要查询的任何键查询UserProfile模型,然后将结果集直接映射回您的用户,例如:

from myapp.models import UserProfile

profiles = UserProfile.objects.filter(activation_key='abcdef')
for profile in profiles:
    print profile.user    # this is the profiles connected user instance

答案 2 :(得分:1)

首先,您并不关心2个用户是否拥有相同的激活密钥。这种情况非常罕见,不能成为任何攻击目标。

其次,为什么不在激活URL中包含用户名? 这样,您就可以确保为每个用户提供唯一的激活URL。 ex: yourwebsite.com/users/activate/{username}/{activationcode}

第三,您可以使用UUID而不是随机。 UUID被授予独特性(不完全是99.99%)。 http://docs.python.org/library/uuid.html

第四,您真的需要将激活码保留在配置文件信息中吗?为什么不创建独立的激活表,甚至可以将主键设置为激活码。大多数情况下,最好将与您经常使用的信息分开的信息分开。

第五,你根本不需要查询User表。您只需查询UserProfile表并检查激活密钥是否存在。然后,只有这样,您才可以使用OneToOne关系映射到原始用户。

答案 3 :(得分:0)

您甚至不需要将related_name值添加到用户关系中。以下查询适用于您的个人资料模型。

User.objects.filter(userinfo__activation_key=word).exists()