django, проверьте, является ли объект частью набора запросов, не возвращающий правильное значение - PullRequest
1 голос
/ 23 апреля 2020

по какой-то причине я получаю вывод 'False' и не уверен почему .. это мой набор запросов и условие на мой взгляд

def book(request):
    test = books.objects.all().values('user')
    print(test)
    print(request.user.id)
    if request.user.id in test:
        exist = True
    else:
        exist = False

    print(exist)

это вывод на консоль, я ожидаю True, но я не уверен, почему он не ищет его правильно. это потому что это список кортежей?

<QuerySet [{'user': 1}, {'user': 1}, {'user': 1}, {'user': 1}, {'user': 1}, {'user': 3}]>                                                   
currently logged in user id:  1                                                                                                             
False  

Ответы [ 3 ]

2 голосов
/ 23 апреля 2020

Вы можете использовать exists(...) метод как,

def book(request):
    <b>exist = books.objects.filter(user=request.user).exists()</b>
    print(exist)
0 голосов
/ 23 апреля 2020

У вас уже есть подходящее решение для вашего текущего варианта использования, но ваш вопрос остался без ответа, так что:

Я не уверен, почему он не ищет его правильно. это потому, что это список кортежей?

На самом деле, это не кортежи, а дикты (и, если быть точным, это не список, а набор запросов - но это здесь неактуально 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
0 голосов
/ 23 апреля 2020
test = books.objects.filter(user_id = request.user.id).exists()
print(test)

это работало как задумано. Теперь я могу вернуть значение:)

...