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'
не будет возвращен в окончательный вариант, он используется для демонстрации этого вопроса.