Запрос к базе данных django ИЛИ условие
Я реализую систему друзей, похожую на facebook, где можно отправлять запросы на дружбу и принимать запросы, а затем видеть своих друзей. На странице, где отображаются запросы на дружбу, я пытаюсь отфильтровать пользователей, которые приняли запрос на дружбу и уже являются друзьями. В приведенном ниже коде 'u' - это текущий зарегистрированный пользователь. Таблица Friendship содержит два поля, оба внешние ключи, смотрите ниже:
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 (сложные запросы), а затем использую iterator, я получаю следующую ошибку:
'Friendship' object has no attribute 'iterator'
Как я могу достичь того, что собираюсь сделать, используя модели/запросы django?
Вам следует использовать .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_id
или to_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)