我有两个模型。一个模型是用户表,其中包含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)
使用谓词[px]和约束[cx.y]。
[p1]用户 (用户 ID( 存在。
[c1.1]用户由用户 ID 标识。
用户{用户 ID} -- p1 KEY {UserID} -- c1.1
[p2]Follower (FollowerID( 跟随作者 (AuthorID(。
[c2.1]关注者是用户。
[c2.2]作者是用户。
[c2.3]对于每个关注者,该关注者可以关注多个作者。
[c2.4]对于每位作者,该作者可以由一个以上的关注者关注。
[c2.5]对于作者和追随者的每种组合,该作者和追随者的组合最多可以发生一次。
[c2.6]作者不得跟随自己。
以下 {AuthorID, FollowerID} -- p2 KEY {AuthorID, FollowerID} -- c2.5, c2.3, c2.4 外键 {追随者 ID} 引用用户 {用户 ID} -- c2.1 外键 {作者ID} 引用用户 {用户ID} -- c2.2 检查作者ID != 关注者ID -- c2.6
底线,多对多。您可以随时调整它以反映您的特定需求,专注于以自然语言表达的概念/逻辑设计 - 谓词和约束。