Я хотел бы использовать 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().
Комментариев нет:
Отправить комментарий