1

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

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

4 回答 4

3

首先,在您的 UserInfo 中添加一个 related_name:

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

希望能帮助到你 :)

于 2012-08-08T01:53:47.713 回答
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
于 2012-08-08T01:54:20.997 回答
1

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

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

第三,您可以使用 UUID 而不是随机的。UUID 被授予是唯一的(不完全是,但 99.99% 的时间)。 http://docs.python.org/library/uuid.html

第四,您真的需要在个人资料信息中保留激活码吗?为什么不创建一个独立的激活表,你甚至可以将主键设置为激活码。大多数时候,最好将不会经常使用的信息与您经常使用的信息分开。

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

于 2012-08-08T02:03:10.163 回答
0

您甚至不需要将related_name 值添加到用户关系中。以下查询适用于您的配置文件模型。

User.objects.filter(userinfo__activation_key=word).exists()
于 2015-01-08T23:24:23.460 回答