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

时间:2016-10-16 10:19:06

标签: django postgresql model psql

在Django模型中,我正在创建一个表'追随者',其中包含:

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

用户可以跟随其他用户这么简单。

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

我尝试了这个,但不起作用:

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

应该怎么做?

感谢

3 个答案:

答案 0 :(得分:2)

除非你有一个名为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会在ORM中返回目标模型实例,而不是ID。这意味着即使基础表可能被称为follower_id,在python代码following.follower中也会返回一个实际的User对象。

答案 1 :(得分:0)

对于用户之间的多对多关系,看成Following实际上是through表。我将创建一个扩展Django Profile模型的User模型,然后声明多对多关系(使用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')

答案 2 :(得分:0)

使用多对多字段。

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