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