Django 学生配对项目
Django student matching project
我目前正在编写一个应用程序,根据相似的兴趣、他们学习的科目、他们居住的地方等来匹配用户
我已经编写了我的用户 creation/login 系统并且可以正常工作。
但是,我正在努力开始使用匹配算法。登录该站点后,我希望它能够遍历其他用户的兴趣(这是兴趣模型的多对多字段),然后 return 相似用户列表,用户与登录用户有一项或多项相同兴趣或参加同一课程的用户。
将其实现到 Django 应用程序中的最佳方法是什么?
非常感谢任何帮助和建议!
我附上了我的模型代码片段以供参考。
非常感谢
models.py
class Interest(models.Model):
title = models.TextField()
def __unicode__(self):
return self.title
class Location(models.Model):
location = models.CharField(max_length=50)
def __unicode__(self):
return self.location
class Course(models.Model):
title = models.CharField(max_length=40)
faculty = models.CharField(max_length=40)
def __unicode__(self):
return self.title
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
date_of_birth = models.DateField()
course = models.ForeignKey(Course, null=True)
location = models.ForeignKey(Location, null=True)
interests = models.ManyToManyField(Interest, null=True)
bio = models.TextField(blank=True)
objects = MyUserManager()
class MyUserManager(BaseUserManager):
def create_user(self, email, date_of_birth, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=MyUserManager.normalize_email(email),
date_of_birth=date_of_birth,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, date_of_birth, password):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
u = self.create_user(email=email,
password=password,
date_of_birth=date_of_birth
)
u.is_admin = True
u.save(using=self._db)
return u
如果您有一个 MyUser
对象 mu
,您可以通过 mu.interests.all()
获得该用户的所有兴趣。您还可以在查找中使用 __in
来测试是否包含在列表或查询集中。因此,如果您想筛选与我们的 mu
用户有共同兴趣的所有 MyUser
对象,您可以这样做:
related_users = MyUser.objects.filter(interests__in=mu.interests.all())
这将生成一个查询集,其中每个 MyUser
对象针对它们的每个兴趣匹配表示一次。例如,如果 user1
与 mu
有两个共同兴趣,而 user2
只有一个共同兴趣,则此过滤器将为我们提供:
[<MyUser: user1>, <MyUser: user1>, <MyUser: user2>]
如果您希望用户只代表一次而不考虑匹配次数,您可以使用 .distinct()
。能够确定匹配的数量可能对您确定 "similarity," 有用,但您最终选择定义它。
(阅读本文的任何人也应该对 collections
和其中很酷的东西感兴趣。阅读此 SO post 了解更多信息:How can I count the occurrences of a list item in Python?)
编辑:您提到您遇到了两个错误:
AttributeErrors; "'QuerySet' object has no attribute 'interest'"
您的 MyUser
对象具有 interest
属性。包含一堆 MyUser
个对象的查询集将不具有该属性,但查询集的成员将具有该属性。
以我们上面定义的related_users
查询集为例。因为它是一个查询集,我们可以做一些事情,比如 .filter()
它或 .get()
来自它的特定对象。我们还可以将其视为列表并访问具有索引位置的单个对象,例如 related_users[0]
- 尽管由于它是一个查询集,我们也可以使用特殊的 .first()
方法。
但是,我们做不到 related_users.interests.all()
- 查询集没有 interests
属性,inside 查询集的各个对象有它.如果我们这样做:
>> for user in related_users:
>> print user.interests.all()
然后我们会看到控制台打印查询集中每个用户的所有兴趣,一次一个用户。如果您想访问 interests
属性,请确保您使用的是单个 MyUser
对象而不是整个查询集。
其他错误:
"'ReverseManyRelatedObjectsDescriptor' object has no attribute 'all'"
您可能正在做类似 MyUser.interests.all()
的事情 - 请记住,MyUser
是您的模型,而不是模型的 实例 。您需要在 MyUser
class 的单个实例上调用 .interests.all()
,而不是一次调用整个 class。换句话说:
>> u = MyUser.objects.get(id=1) #get a single MyUser object
>> u.interests.all()
与另一个问题几乎相同 - 如果您想访问 interests
属性,请确保您使用的是单个 MyUser
对象而不是 class定义。
I wondered if you could help me in implementing this into a view? How
would I make sure that the single MyUser object is the user that is
currently logged in?
在您的视图中,您可以访问 request.user
(或 self.request.user
用于基于 class 的视图)。那个对象应该是你想要的那个。如果不是,我注意到您正在使用 AbstractBaseUser
- 确保您定义的自定义身份验证模型是否已正确配置,否则您会 运行 在这里遇到麻烦。
And would there be a way to display which interests the users have in
common?
对于您的初始用户对象和您为构建 related_users
查询集而抓取的用户对象,您将有权访问 .interests.all()
- 您可以比较视图中的两个列表并确定他们有什么共同点。
我目前正在编写一个应用程序,根据相似的兴趣、他们学习的科目、他们居住的地方等来匹配用户
我已经编写了我的用户 creation/login 系统并且可以正常工作。 但是,我正在努力开始使用匹配算法。登录该站点后,我希望它能够遍历其他用户的兴趣(这是兴趣模型的多对多字段),然后 return 相似用户列表,用户与登录用户有一项或多项相同兴趣或参加同一课程的用户。
将其实现到 Django 应用程序中的最佳方法是什么?
非常感谢任何帮助和建议!
我附上了我的模型代码片段以供参考。 非常感谢
models.py
class Interest(models.Model):
title = models.TextField()
def __unicode__(self):
return self.title
class Location(models.Model):
location = models.CharField(max_length=50)
def __unicode__(self):
return self.location
class Course(models.Model):
title = models.CharField(max_length=40)
faculty = models.CharField(max_length=40)
def __unicode__(self):
return self.title
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
date_of_birth = models.DateField()
course = models.ForeignKey(Course, null=True)
location = models.ForeignKey(Location, null=True)
interests = models.ManyToManyField(Interest, null=True)
bio = models.TextField(blank=True)
objects = MyUserManager()
class MyUserManager(BaseUserManager):
def create_user(self, email, date_of_birth, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=MyUserManager.normalize_email(email),
date_of_birth=date_of_birth,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, date_of_birth, password):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
u = self.create_user(email=email,
password=password,
date_of_birth=date_of_birth
)
u.is_admin = True
u.save(using=self._db)
return u
如果您有一个 MyUser
对象 mu
,您可以通过 mu.interests.all()
获得该用户的所有兴趣。您还可以在查找中使用 __in
来测试是否包含在列表或查询集中。因此,如果您想筛选与我们的 mu
用户有共同兴趣的所有 MyUser
对象,您可以这样做:
related_users = MyUser.objects.filter(interests__in=mu.interests.all())
这将生成一个查询集,其中每个 MyUser
对象针对它们的每个兴趣匹配表示一次。例如,如果 user1
与 mu
有两个共同兴趣,而 user2
只有一个共同兴趣,则此过滤器将为我们提供:
[<MyUser: user1>, <MyUser: user1>, <MyUser: user2>]
如果您希望用户只代表一次而不考虑匹配次数,您可以使用 .distinct()
。能够确定匹配的数量可能对您确定 "similarity," 有用,但您最终选择定义它。
(阅读本文的任何人也应该对 collections
和其中很酷的东西感兴趣。阅读此 SO post 了解更多信息:How can I count the occurrences of a list item in Python?)
编辑:您提到您遇到了两个错误:
AttributeErrors; "'QuerySet' object has no attribute 'interest'"
您的 MyUser
对象具有 interest
属性。包含一堆 MyUser
个对象的查询集将不具有该属性,但查询集的成员将具有该属性。
以我们上面定义的related_users
查询集为例。因为它是一个查询集,我们可以做一些事情,比如 .filter()
它或 .get()
来自它的特定对象。我们还可以将其视为列表并访问具有索引位置的单个对象,例如 related_users[0]
- 尽管由于它是一个查询集,我们也可以使用特殊的 .first()
方法。
但是,我们做不到 related_users.interests.all()
- 查询集没有 interests
属性,inside 查询集的各个对象有它.如果我们这样做:
>> for user in related_users:
>> print user.interests.all()
然后我们会看到控制台打印查询集中每个用户的所有兴趣,一次一个用户。如果您想访问 interests
属性,请确保您使用的是单个 MyUser
对象而不是整个查询集。
其他错误:
"'ReverseManyRelatedObjectsDescriptor' object has no attribute 'all'"
您可能正在做类似 MyUser.interests.all()
的事情 - 请记住,MyUser
是您的模型,而不是模型的 实例 。您需要在 MyUser
class 的单个实例上调用 .interests.all()
,而不是一次调用整个 class。换句话说:
>> u = MyUser.objects.get(id=1) #get a single MyUser object
>> u.interests.all()
与另一个问题几乎相同 - 如果您想访问 interests
属性,请确保您使用的是单个 MyUser
对象而不是 class定义。
I wondered if you could help me in implementing this into a view? How would I make sure that the single MyUser object is the user that is currently logged in?
在您的视图中,您可以访问 request.user
(或 self.request.user
用于基于 class 的视图)。那个对象应该是你想要的那个。如果不是,我注意到您正在使用 AbstractBaseUser
- 确保您定义的自定义身份验证模型是否已正确配置,否则您会 运行 在这里遇到麻烦。
And would there be a way to display which interests the users have in common?
对于您的初始用户对象和您为构建 related_users
查询集而抓取的用户对象,您将有权访问 .interests.all()
- 您可以比较视图中的两个列表并确定他们有什么共同点。