为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查 django 模型 ManyToManyField 是否对称,如果对称 = False?

如何检查 django 模型 ManyToManyField 是否对称,如果对称 = False?

倚天杖 2022-07-19 15:28:55
我正在尝试在 Django 中创建一个追随者系统。follows = models.ManyToManyField('self', related_name='follower', symmetrical=False, null=True, blank=True)由于系统不应该是对称的,我如何检查两个用户是否互相关注?如果可能的话,我想在模型中有一个函数。我可能会在limit_choices_to另一个领域和其他一些地方使用这个功能。我最初的想法是添加一个“朋友”字段并使其对称,但这可能会在以后带来其他问题。
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

我没有找到一个简单的解决方案,不需要额外的模型。这是我所做的:


Person(models.Model)如果您有类似的CustomUser(AbstractUser)实现,则不需要创建。否则Person,类在许多情况下都很有用。


count_函数非常有用,但对于大多数用例来说不是必需的。


在里面accounts/models.py我补充说:


RELATIONSHIP_FOLLOWING = 1

RELATIONSHIP_BLOCKED = 2

RELATIONSHIP_STATUSES = (

    (RELATIONSHIP_FOLLOWING, 'Following'),

    (RELATIONSHIP_BLOCKED, 'Blocked'),

)


class Person(models.Model):

     relationships = models.ManyToManyField('self', through='Relationship',

                                           symmetrical=False,

                                           related_name='related_to')


     def get_relationships(self, status):

        return self.relationships.filter(

            to_people__status=status,

            to_people__from_person=self)


    def get_related_to(self, status):

        return self.related_to.filter(

            from_people__status=status,

            from_people__to_person=self)


    def get_following(self):

        return self.get_relationships(RELATIONSHIP_FOLLOWING)


    def get_followers(self):

        return self.get_related_to(RELATIONSHIP_FOLLOWING)


    def count_following(self):

        return len(self.get_relationships(RELATIONSHIP_FOLLOWING))


    def count_followers(self):

        return len(self.get_related_to(RELATIONSHIP_FOLLOWING))


    def get_friends(self):

        return self.relationships.filter(

            to_people__status=RELATIONSHIP_FOLLOWING,

            to_people__from_person=self,

            from_people__status=RELATIONSHIP_FOLLOWING,

            from_people__to_person=self)


    def count_friends(self):

        return len(self.get_friends())


class Relationship(models.Model):

    from_person = models.ForeignKey(Person, related_name='from_people', on_delete=models.CASCADE)

    to_person = models.ForeignKey(Person, related_name='to_people', on_delete=models.CASCADE)

    status = models.IntegerField(choices=RELATIONSHIP_STATUSES)


    def add_relationship(self, person, status):

        relationship, created = Relationship.objects.get_or_create(

            from_person=self,

            to_person=person,

            status=status)

        return relationship


    def remove_relationship(self, person, status):

        Relationship.objects.filter(

            from_person=self,

            to_person=person,

            status=status).delete()

        return


查看完整回答
反对 回复 2022-07-19
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号