用于相互跟踪查询的Django ORM
login用于相互跟踪查询的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 这里有很多问题,
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
这里有很多问题,我将尝试解决它们
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