Использование filter__in через отношение Foreignkey возвращает пустой набор запросов
Я пытаюсь использовать queryset category_filter
как filter__in // Django doc для другого запроса qs_poller
. Однако запрос возвращает пустое множество
# View
def render_random_poller(request):
if request.user.is_authenticated:
category_filter = Category.objects.filter(usercategoryfilter__user=request.user)
# Returns <QuerySet [<Category: Sports>, <Category: Lifestyle>, <Category: Environment>]>
qs_poller = Poller.objects.filter(poller_category__category__in=category_filter).order_by('-created_on')[:100]
# Returns an empty set, although the database holds 5 entries matching the category_filter
# Models
class UserCategoryFilter(models.Model):
user = models.ForeignKey(Account, on_delete=models.CASCADE)
categories_selected = models.ManyToManyField(Category)
class Poller(models.Model):
created_by = models.ForeignKey(Account, on_delete=models.SET(get_deleted_user))
poller_category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
class Category(models.Model):
category = models.CharField(max_length=30)
Вы неправильно фильтруете в qs_poller
. Добавляя дополнительное __category
, вы на самом деле фильтруете по самому полю CharField, а не по внешнему ключу, по которому вы хотите фильтровать.
Вместо этого вы хотите сделать следующее:
qs_poller = Poller.objects.filter(poller_category__in=category_filter).order_by('-created_on')[:100]
Вы должны фильтровать по полю category
, а не по полю category
категории, поэтому:
qs_poller = Poller.objects.filter(
poller_category__in=category_filter
).order_by('-created_on')[:100]
Вы также можете упростить фильтрацию до:
qs_poller = Poller.objects.filter(
poller_category__usercategoryfilter__user=request.user
).order_by('-created_on')[:100]
Таким образом, будет построен запрос для поиска всех Poller
, имеющих в качестве poller_category
категорию , связанную с , указанную в модели UserCategoryFilter
, которая связана с request.user
.