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 对象针对它们的每个兴趣匹配表示一次。例如,如果 user1mu 有两个共同兴趣,而 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() - 您可以比较视图中的两个列表并确定他们有什么共同点。