Получение идентификатора объекта из набора запросов в Django - PullRequest
0 голосов
/ 02 июня 2018

В моей базе данных есть таблица контрактов, контракты основаны главным образом на листинге и двух пользователях.При создании контракта я хочу проверить, существует ли контракт, и если это так, перенаправить пользователя (ей) к созданному контракту.Вот код на мой взгляд:

def create_proposal (request, conversation_pk):
existing_proposal = Contract.objects.filter(users__in=[user_1, user_2]).filter(listing_id=listing).values_list('id', flat=True)

Затем я перенаправить с помощью:

    if existing_proposal.exists():
    messages.success(request, "the proposal already exists")
    return HttpResponseRedirect(reverse('agreement:agreement', kwargs={'pk': existing_proposal[0].pk}))

Однако я получаю следующую ошибку:

AttributeError at /en/agreement/create_proposal/32
'int' object has no attribute 'pk'

1 Ответ

0 голосов
/ 02 июня 2018

values_list возвращает список значений, поэтому у вас нет набора запросов при оценке выражения, у вас буквально есть список первичных ключей.Вы будете использовать это, когда хотите добавить, скажем, просто поле модели и выполнить итерацию по нему, чтобы выполнить какую-то оценку.Рабочая лошадка для поиска существующего предложения здесь сделана с помощью операторов filter.

Поскольку вы предполагаете, что есть одно (и только одно совпадение), лучше сделать:

existing_proposal = Contract.objects.filter(users__in=[user_1, user_2]).filter(listing_id=listing).only('id').first()

Возвращает первый Contract объект, который соответствует критериям вашего фильтра, с его id, который вам необходим для перенаправления на него.

Затем для назначения в вашемперенаправление:

{'pk': existing_proposal.pk}

only не является обязательным, но почему бы не оптимизировать вызов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...