django 数据库查询或条件
django database query OR condition
我正在实现一个类似于 facebook 的好友系统,可以在其中发送好友请求和接受请求,然后查看他们的好友。在看到好友请求的页面上,我试图过滤掉已经接受好友请求并且现在已经是好友的用户。在下面的代码中,'u' 是当前登录的用户。友情table持有两个字段,都是外键,请看下面:
try:
already_friends = Friendship.objects.get(Q(from_friend=u) | Q(to_friend=u))
for x in already_friends.iterator():
my_requests = FriendRequest.objects.filter(Q(receiver=request.user) & ~Q(sender=x))
except ObjectDoesNotExist:
class FriendRequest(models.Model):
sender = models.ForeignKey(User, related_name='the_sender',on_delete=models.CASCADE)
receiver = models.ForeignKey(User, related_name='the_receiver', on_delete=models.CASCADE)
def __str__(self):
return "request sent"
class Meta:
unique_together = (('sender', 'receiver'),)
class Friendship(models.Model):
from_friend = models.ForeignKey(User, related_name="from_friend", on_delete=models.CASCADE)
to_friend= models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return "Friend request accepted"
class Meta:
unique_together = (('from_friend', 'to_friend'),)
当我使用我在顶部使用 Q(复杂查询)编写的查询,然后使用迭代器时,出现以下错误:
'Friendship' object has no attribute 'iterator'
如何使用 django 实现我打算做的事情 models/queries?
你应该使用 .filter(…)
[Django-doc] not .get(…)
[Django-doc]: .get(…)
检索一个 单个 Friendship
对象,如果没有这样的对象将引发错误,或者如果有多个。另一方面,.filter(…)
将 return 满足给定谓词的所有 Friendship
记录的(可能为空)查询集:
already_friends = Friendship.objects<strong>.filter(</strong>Q(from_friend=u) | Q(to_friend=u)<strong>)</strong>
for x in already_friends.iterator():
my_requests = FriendRequest.objects.filter(Q(receiver=request.user) & ~Q(sender=x))
此外,使用 Q(sender=x)
没有任何意义:x
是一个 Friendship
对象,而不是用户对象。您可能想检查 from_friend_id
或 to_friend_id
是否是 u
,然后使用另一个进行过滤。类似于:
already_friends = Friendship.objects<strong>.filter(</strong>Q(from_friend=u) | Q(to_friend=u)<strong>)</strong>
for x in already_friends.iterator():
if x.from_user_id = u.id:
my_requests = FriendRequest.objects.filter(receiver=request.user, sender_id=x.to_user_id)
else:
my_requests = FriendRequest.objects.filter(receiver=request.user, sender_id=x.from_user_id)
我正在实现一个类似于 facebook 的好友系统,可以在其中发送好友请求和接受请求,然后查看他们的好友。在看到好友请求的页面上,我试图过滤掉已经接受好友请求并且现在已经是好友的用户。在下面的代码中,'u' 是当前登录的用户。友情table持有两个字段,都是外键,请看下面:
try:
already_friends = Friendship.objects.get(Q(from_friend=u) | Q(to_friend=u))
for x in already_friends.iterator():
my_requests = FriendRequest.objects.filter(Q(receiver=request.user) & ~Q(sender=x))
except ObjectDoesNotExist:
class FriendRequest(models.Model):
sender = models.ForeignKey(User, related_name='the_sender',on_delete=models.CASCADE)
receiver = models.ForeignKey(User, related_name='the_receiver', on_delete=models.CASCADE)
def __str__(self):
return "request sent"
class Meta:
unique_together = (('sender', 'receiver'),)
class Friendship(models.Model):
from_friend = models.ForeignKey(User, related_name="from_friend", on_delete=models.CASCADE)
to_friend= models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return "Friend request accepted"
class Meta:
unique_together = (('from_friend', 'to_friend'),)
当我使用我在顶部使用 Q(复杂查询)编写的查询,然后使用迭代器时,出现以下错误:
'Friendship' object has no attribute 'iterator'
如何使用 django 实现我打算做的事情 models/queries?
你应该使用 .filter(…)
[Django-doc] not .get(…)
[Django-doc]: .get(…)
检索一个 单个 Friendship
对象,如果没有这样的对象将引发错误,或者如果有多个。另一方面,.filter(…)
将 return 满足给定谓词的所有 Friendship
记录的(可能为空)查询集:
already_friends = Friendship.objects<strong>.filter(</strong>Q(from_friend=u) | Q(to_friend=u)<strong>)</strong>
for x in already_friends.iterator():
my_requests = FriendRequest.objects.filter(Q(receiver=request.user) & ~Q(sender=x))
此外,使用 Q(sender=x)
没有任何意义:x
是一个 Friendship
对象,而不是用户对象。您可能想检查 from_friend_id
或 to_friend_id
是否是 u
,然后使用另一个进行过滤。类似于:
already_friends = Friendship.objects<strong>.filter(</strong>Q(from_friend=u) | Q(to_friend=u)<strong>)</strong>
for x in already_friends.iterator():
if x.from_user_id = u.id:
my_requests = FriendRequest.objects.filter(receiver=request.user, sender_id=x.to_user_id)
else:
my_requests = FriendRequest.objects.filter(receiver=request.user, sender_id=x.from_user_id)