跟随者跟随表是多对多的关系吗?

时间:2018-06-07 00:12:24

标签: python django database-design django-models orm

我有两个型号。一个模型是Users表,其中包含id, username, email之类的字段,我有另一个表,用于显示关注者和跟随关系。显示以下模型:

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

    def __str__(self):
        return '{} is followed by {}'.format(self.target, self.follower)

我假设用户和关注之间的关系是一对多的关系(一个用户可以有很多关注者,也可以跟随很多关注者)。它是否正确?或者它应该是多对多的关系。如果是这样,为什么?我已经看到这个表模式的很多实例都是多对多,一对多。

用户类:

class User(AbstractBaseUser):
    username    = models.CharField(max_length=15, unique=True)
    email       = models.EmailField(max_length=100, unique=True)
    date_joined = models.DateTimeField(auto_now_add=True,
                                       null=True) 
    active      = models.BooleanField(default=True)
    staff       = models.BooleanField(default=False)
    admin       = models.BooleanField(default=False)

1 个答案:

答案 0 :(得分:1)

使用谓词 [px] 和约束 [cx.y]

[p1] 用户(UserID)存在。

[c1.1] 用户由UserID标识。

user {UserID}  -- p1
 KEY {UserID}  -- c1.1

[p2] 关注者(FollowerID)关注作者(作者ID)。

[c2.1] 追随者是用户。

[c2.2] 作者是用户。

[c2.3] 对于每位粉丝,该关注者可能会关注多位作者。

[c2.4] 对于每位作者,该作者后面可能会有多位粉丝。

[c2.5] 对于作者和关注者的每个组合,该作者和该关注者的组合最多可能出现一次。

[c2.6] 作者可能不会跟随自己。

following {AuthorID, FollowerID} -- p2
      KEY {AuthorID, FollowerID} -- c2.5, c2.3, c2.4

FOREIGN KEY {FollowerID} REFERENCES user {UserID} -- c2.1
FOREIGN KEY {AuthorID}   REFERENCES user {UserID} -- c2.2

      CHECK AuthorID != FollowerID                -- c2.6

底线,多对多。您可以通过专注于以自然语言表达的概念/逻辑设计 - 谓词和约束来调整此项以反映您的特定需求。