我目前正在构建一个具有朋友功能的网络应用程序(例如 Facebook 等)。
当好友发送好友请求时,会创建一个好友对象accepted = False
。accepted
设置为True
当被请求的朋友接受请求时。
这是我的模型(大大简化了):
class Friendship(models.Model):
sender = models.ForeignKey('Person', related_name='sender')
receiver = models.ForeignKey('Person', related_name='receiver')
accepted = models.BooleanField(default=False)
class Person(models.Model):
person = models.OneToOneField(User)
friends = models.ManyToManyField('self', through=Friendship)
我有这样的,所以我也可以管理朋友请求。
现在假设我有一个人约翰。我想获取 John 的所有朋友(例如,所有接受 John 的朋友请求的朋友,以及所有其朋友请求 John 已接受的朋友)。
这是我现在的做法:
def friends(person):
friends = Friendship.objects.filter(sender=person, accepted=True) | Friendship.objects.filter(receiver=person, accepted=True)
friends = [friendship.sender for friendship in friends if friendship.sender != person] + \
[friendship.receiver for friendship in friends if friendship.receiver != person]
return friends
对我来说,这看起来真的很丑陋,可能很慢而且效率低下。Django 有办法做这样的事情吗?
def friends(person):
return person.friends.filter(accepted=True)
不幸的是,这个确切的代码不起作用。有没有更好的办法?