У вас уже есть подходящее решение для вашего текущего варианта использования, но ваш вопрос остался без ответа, так что:
Я не уверен, почему он не ищет его правильно. это потому, что это список кортежей?
На самом деле, это не кортежи, а дикты (и, если быть точным, это не список, а набор запросов - но это здесь неактуально xD)
Теперь забудьте о Django, предположим, у нас действительно есть простой список слов:
test = [
{'user': 1}, {'user': 1}, {'user': 1},
{'user': 1}, {'user': 1}, {'user': 3}
]
и целое число user_id:
user_id = 1
затем выражение
user_id in test
фактически составляет:
found = False
for item in test:
if item == user_id:
found = True
break
Теперь, поскольку элементы в test
являются диктами, вы фактически тестируете:
{'user': 1} == 1
, который гарантированно будет ложным, поскольку dict и int, очевидно, не могут сравниваться равными; -)
То, что вам нужно здесь (в чистом виде Python я имею в виду - надеюсь, SQL db может быть лучше), будет либо сравнивать user_id
с 'user' value каждого элемента:
found = False
for item in test:
if item["user"] == user_id:
found = True
break
или создать подобный запрос, чтобы вы могли использовать тест сдерживания:
target = {"user": user_id}
target in test