Django, фильтр запросов не применяется к предварительно выбранным данным

У меня есть таблица, которая содержит данные о карточках, и другая таблица, которая содержит данные инвентаризации этих карточек для пользователей.

Я пытаюсь получить данные карты и включить инвентарные количества для возвращенных карт. Я делаю это, добавляя предварительную выборку для запроса.

Однако, когда я пытаюсь отфильтровать предварительно найденные данные по идентификатору пользователя, он по-прежнему возвращает данные для пользователей, отличных от того, который вошел в систему.

Код:

sql_int = "CAST((REGEXP_MATCH(number, '\d+'))[1] as INTEGER)"
cards = magic_set_cards.objects.all().exclude(side='b').extra(select={'int': sql_int}) \
    .prefetch_related(Prefetch('inventoryCards', queryset=inventory_cards.objects.filter(user_id=request.user.id))) \
    .values('id', 'set_id__code', 'set_id__name', 'set_id__isOnlineOnly', 'number', 'name', 'imageUri', 'hasNonFoil', 'hasFoil', 'inventoryCards__user_id', 'inventoryCards__nonfoil', 'inventoryCards__foil') \
    .order_by('-set_id__releaseDate', 'set_id__name', 'int', 'number')

Возвращенные данные:

{
    'id': UUID('a7ef0985-345d-4d0d-bd71-069870ce4fd6'),
    'set_id__code': 'MID',
    'set_id__name': 'Innistrad: Midnight Hunt',
    'set_id__isOnlineOnly': False,
    'number': '46',
    'name': 'Curse of Surveillance',
    'imageUri': 'https://c1.scryfall.com/file/scryfall-cards/normal/front/d/6/d6a5b3b2-4f27-4c97-9d87-d7bdcc06d36a.jpg?1634348722', 
    'hasNonFoil': True,
    'hasFoil': True,
    'inventoryCards__user_id': 3,
    'inventoryCards__nonfoil': 2,
    'inventoryCards__foil': 0
}, 
{
    'id': UUID('a7ef0985-345d-4d0d-bd71-069870ce4fd6'),
    'set_id__code': 'MID',
    'set_id__name': 'Innistrad: Midnight Hunt',
    'set_id__isOnlineOnly': False,
    'number': '46',
    'name': 'Curse of Surveillance',
    'imageUri': 'https://c1.scryfall.com/file/scryfall-cards/normal/front/d/6/d6a5b3b2-4f27-4c97-9d87-d7bdcc06d36a.jpg?1634348722', 
    'hasNonFoil': True,
    'hasFoil': True,
    'inventoryCards__user_id': 1,
    'inventoryCards__nonfoil': 0,
    'inventoryCards__foil': 1
}
...

Как видно из приведенных выше данных, это одни и те же карты, но он возвращает данные инвентаризации для двух разных пользователей.

Обратите внимание, что 'inventoryCards__user_id' не будет возвращен в окончательный вариант, он используется для демонстрации этого вопроса.

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