Исключение существующих пользователей в поле ManyToManyField
Я создаю небольшой BlogApp и создаю функцию добавления любимых пользователей. Пользователь может найти и добавить пользователя в свой список избранных пользователей
Сейчас я создаю функцию if searched user is already in another's users favorite user list then exclude the user from the result
Например :- Если пользователь_1 добавил пользователя_50 в список своих любимых пользователей. и тогда, если пользователь_2 ищет пользователя_50, то он не будет отображаться в списке поиска.
НО когда я пытаюсь исключить, он не исключает.
models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,unique=True)
full_name = models.CharField(max_length=100,default='')
friends = models.ManyToManyField("Profile",blank=True)
email = models.EmailField(max_length=60,default='')
class FavouriteUsers(models.Model):
adder = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
favouriteUser = models.ManyToManyField(User, related_name='favouriteUser', blank=True)
views.py
def search_users_favourite(request):
q = request.GET.get('q')
exclude_this = FavouriteUsers.objects.filter(favouriteUser=request.user)
results = Profile.objects.filter(user__username__icontains=q).exclude(exclude_this)
serialized_results = []
for result in results:
serialized_results.append({
'id': result.id,
'username': result.user.username,
})
return JsonResponse({'results': serialized_results})
НО это показывает :-
TypeError: Невозможно фильтровать по безусловному выражению.
Я пробовал много раз, но все равно эта ошибка.
Любая помощь будет оценена по достоинству.
Заранее благодарю вас.
Я думаю, что вы должны делать это таким образом
exclude_this = FavouriteUsers.objects.filter(favouriteUser=request.user).values_list('favouriteUser__username',flat=True)
results = Profile.objects.filter(user__username__icontains=q).exclude(user__username__in=exclude_this)
здесь, я предполагаю, вы хотите исключить имена пользователей, совпадающие с полным именем.
Для более точного ответа, пожалуйста, приложите журнал ошибки.
Попробуйте этот запрос:
Profile.objects.filter(user__username__icontains=q, user__favouriteUser__isnull=True)
Это исключит все профили, которые уже отображены в FavouriteUsers
(уже были любимыми)