![](/img/trans.png)
[英]SalesforceMalformedRequest Error while querying salesforce through Django
[英]Django querying with Through table properties
我目前正在构建一个具有好友功能的Web应用程序(例如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)
不幸的是,这个确切的代码不起作用。 有没有更好的办法?
我最近不得不运行一个非常相似的查询。 这样的东西(或类似的东西)应该起作用:
def friends(person):
friends = Person.objects.filter(Q(sender__receiver=person, sender__accepted=True) | Q(receiver__sender=person, receiver__accepted=True))
return friends
您可以使用M2M模型的Person.objects.filter(sender__accepted=True)
属性在相关字段上进行Person.objects.filter(sender__accepted=True)
,例如Person.objects.filter(sender__accepted=True)
友谊关系中的另一个人是“朋友”。 即,如果您是接收者,则朋友是发送者,反之亦然。 我还将重命名相关的名称“发送者”和“接收者”,并在其前面加上“朋友”,因此上面的查询更加清晰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.