GOOGLE ADS

среда, 13 апреля 2022 г.

Django get_or_create не может установить поле при использовании с iexact

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

В моей модели Provider есть поле имени, которое я использую в файлах get_or_create.

Поиск работает нормально, но при первом создании экземпляра, как в приведенном ниже примере p1/Timber (имя

Не удается:

>>> p1, c1 = Provider.objects.get_or_create(name__iexact="Timber")
>>> p1, c1
(<Provider: >, True)
>>> p1.name
u''

Здесь работает как положено:

>>> p2, c2 = Provider.objects.get_or_create(name="Cedar")
>>> p2.name, c2
('Cedar', True)
>>> p3, c3 = Provider.objects.get_or_create(name__iexact="Cedar")
>>> p3, c3
(<Provider: Cedar>, False)
>>> Provider.objects.get_or_create(name__iexact="cedar")
(<Provider: Cedar>, False)

__iexactНесовместимо с частью создания, это get_or_createожидаемое поведение (и почему), или я столкнулся с ошибкой Django?


Решение проблемы

То, что вы видите, является правильным поведением.

get_or_createявляется сокращением от «получить и вернуть соответствующий объект kwargs, если он не существует, создать его с помощью defaults». Ваш поиск ищет объект, где nameне учитывается регистр совпадений с 'cedar'. Этот объект существует, поэтому он возвращается. Ни больше ни меньше.

Теперь, если совпадения не было, Стефан прав, и вам нужно было бы указать nameв defaultsпараметре. Все запросы, содержащие разделитель поиска __, удаляются из параметров, переданных в create().

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...