Django 模型:用户和关注者的数据库设计

Django models: database design for user and follower

在 Django 模型中,我正在制作一个 table 'followers',它有:

user's id. (this is followed by)
user's id (this is follower)

一个用户可以关注其他用户,这很简单。

我应该如何在 Django 中定义模型?

我试过了,但没有用:

user = models.ForeignKey('self')
follower_id = models.ForeignKey('self')

应该怎么做?

谢谢

除非您有一个名为 self 的模型,否则 'self' 参数将不起作用。

假设您的分配模型称为 Following,并且您使用的是内置 User 模型,那么您可以:

class Following(models.Model):
    target = models.ForeignKey('User', related_name='followers')
    follower = models.ForeignKey('User', related_name='targets')

这可能需要一些进一步的唯一性和验证逻辑。

注意 related_name 属性,参见 https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ForeignKey.related_name。这意味着对于给定的用户对象,您可以执行 user.targets.all() 来获取他们关注的用户,并执行 user.followers.all() 来获取关注他们的用户。

另请注意,Django return在 ORM 中的目标模型实例,而不是 ID。这意味着即使底层 table 可能被称为 follower_id,在 python 代码中 following.follower 将 return 一个实际的用户对象。

看似Following其实就是through table User之间的多对多关系。我会创建一个扩展 Django User 模型的 Profile 模型,然后声明多对多关系(使用 ManyToManyField)。

from django.contrib.auth.models import User
from django.db import models

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    following = models.ManyToManyField(User, related_name='followers')

使用多对多字段。

followers = models.ManyToManyField('self', symmetrical=False)