用于相互跟踪查询的Django ORM

用于相互跟踪查询的Django ORM,django,Django,loginuser id=3,现在我想让跟随我的人和我跟随他们的人在django框架中相互跟随登录用户。上面的senario显示登录名user(id=3)跟随user(id=2) 和user(id=2)也跟着登录user(id=3)现在我想向登录用户显示,有多少用户跟着你,你跟着他。使用django orm user_id user_follow 3 2 3 2 3 2 2 3 这里有很多问题,

login
user id=3
,现在我想让跟随我的人和我跟随他们的人在django框架中相互跟随登录用户。上面的senario显示登录名
user(id=3)
跟随
user(id=2)
user(id=2)
也跟着登录
user(id=3)
现在我想向登录用户显示,有多少用户跟着你,你跟着他。使用django orm

user_id   user_follow
3             2
3             2
3             2
2             3

这里有很多问题,我将尝试解决它们

  • 你的模型描述的关系就是所谓的a。简单地说,Cause对用户来说有很多,出席率是一个中间表。使用至指令的好处主要在于易于访问,您可以阅读我链接的文档以获取示例。因此:

    class Cause(models.Model):
        description = models.TextField()
        start_date = models.DateTimeField(null=True, blank=True)
        creation_date = models.DateTimeField(default=datetime.now)
        creator = models.ForeignKey(User, related_name='cause_creator_set')
        attendees = models.ManyToManyField(User)
    
    
    class Attendance(models.Model):
    
        user = models.ForeignKey(User)
        cause = models.ForeignKey(Cause)
        user_follow = models.IntegerField(max_length=255)
        registration_date = models.DateTimeField(default=datetime.now)
        follow = models.BooleanField(default=False)
    
        def __unicode__(self):
            return "%s is attending %s" % (self.user.username, self.event)
    
        class Meta(object):
            verbose_name_plural = "Attendance"
    
  • 现在让我们谈谈出勤率。我对两个字段有问题:

    attendees = models.ManyToManyField(User, through='Attendance')
    
    是的,我展示了3个,因为其中只有2个有问题。所以你有一个用户的外键,对吗?但什么是外国钥匙?它只是一个指向另一个表的行(pk)的整数字段。这里还有其他事情发生,但最基本的是它只是一个整数域。然后你又想把模型和用户联系起来,对吗?因此,您没有添加另一个ForeignKey,而是使用了IntegerField

    你明白为什么这是件坏事吗?我会解释的-你不能根据自己的逻辑使用ORM。现在我假设你们在这里要完成的基本任务实际上是:

    user = models.ForeignKey(User)
    user_follow = models.IntegerField(max_length=255)
    follow = models.BooleanField(default=False)
    
    然后是
    follow
    布尔值,我真的不明白-如果一个用户链接到另一个用户,这不就自动意味着他在跟踪他吗?看起来更像是一种方法

    总之,我可以想出两个非常有效的选择:

    • 使用另一个外键。真的,如果这有道理的话,多个外国钥匙没有什么错。事实上,它将创建一种从用户到他自己的许多人作为中间表来处理出席情况。我认为这是有道理的

    • 创建自己的用户类。我也推荐这个,因为你似乎有很多定制。内置用户非常棒,因为它几乎是开箱即用的。但同时,内置用户基本上是围绕管理界面构建的,这对您有很大的限制。定制的比较容易。然后你可以做你想做的事情,然后implament
      作为一种布尔方法(似乎更合适)

  • 我要做的最后一件事是向你展示你正在寻找的方法。我向您展示了如何做到这一点,但正如我提到的,我强烈建议您首先采纳我的建议,构建自己的用户模型。当然,这种方法看起来会有所不同,但转换起来并不困难

    这就是说,这里的关键只是创建两个方法——一个用于检查用户是否相关。第二个用来检查你是否被他跟踪。因此,如果我理解正确,您正试图实现:

    # let's pretend that User isn't built-in
    class User(models.Model):
        follow = models.ManyToManyField('self')
    

  • 你是在问如何通过ORM使用多人关系吗?是的。但是请把上面的问题交给塞纳里奥。我是如何获得共同关注用户名并向登录用户显示他们的,这些人关注你,你也关注他们上述场景没有什么特别之处(除了无法解释的重复),但我肯定会给你一个解释(如果没有人比我更了解的话)哈哈哈。哥哥给我。上帝保佑你。你可以假设上表是mutual.object.all()和User.object.all(),用于登录用户。是的,如果你也能分享你的模型,那将是有益的。py。我可以给你一个更具体的答案
      #using your way
        def follows(a, b):
            if Attendence.objects.filter(user__pk=a, user_follow=b).count() > 0:
                return True
            return False
    
        def mutual(a, b):
            if follows(a, b) and follows(b, a):
                return True
            return False
    
        a, b = 2, 3
        mutual(2, 3) # will output True
    
    
      #using a custom User Class:
       class MyUser(AbstractBaseUser):
           # required fields here...
           follow = models.ManyToManyField('self')
    
           def is_following(self, user):
               if user in self.follow.all():
                   return True
               return False    
    
           def mutual(self, user):
               if self.is_following(user) and user.is_following(self):
                   return True
               return False