我正在實施一個類似于 facebook 的朋友系統,可以在其中發送友誼請求并接受請求,然后查看他們的朋友。在看到好友請求的頁面上,我試圖過濾掉已接受好友請求并且現在已經是好友的用戶。在下面的代碼中,'u' 是當前登錄的用戶。友誼表有兩個欄位,都是外鍵,見下圖:
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 模型/查詢實作我打算做的事情?
uj5u.com熱心網友回復:
您應該使用.filter(…)[Django-doc]而不是.get(…)[Django-doc]:.get(…)檢索單個 Friendship物件,如果沒有這樣的物件,或者有多個物件,則會引發錯誤。.filter(…)另一方面,將回傳Friendship滿足給定謂詞的所有記錄的(可能為空)查詢集:
already_friends = Friendship.objects.filter(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))
此外,使用Q(sender=x):x是一個Friendship物件,而不是用戶物件是沒有意義的。您可能想要檢查from_friend_idorto_friend_id是否為u,從而使用另一個進行過濾。就像是:
already_friends = Friendship.objects.filter(Q(from_friend=u) | Q(to_friend=u))
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/343306.html
標籤:Python 姜戈 数据库 sqlite django-models
上一篇:在Django中向模型添加外鍵時NOT_NULL約束失敗
下一篇:根據InQuery回傳不同的訂單
