我有两个型号。一个模型是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)
答案 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
底线,多对多。您可以通过专注于以自然语言表达的概念/逻辑设计 - 谓词和约束来调整此项以反映您的特定需求。