Использование 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.

Вернуться на верх