Django: Конверс `__endswith`

Django позволяет мне это сделать:

chair = Chair.objects.filter(name__endswith='hello') 

Но я хочу сделать это:

 chair = Chair.objects.filter(name__isendof='hello') 

Я знаю, что поиск __isendof не существует. Но я хочу что-то вроде этого. Я хочу, чтобы это было обратное __endswith . Он должен найти все стулья, такие как 'hello'.endswith(chair.name) .

Возможно в Django? Операции ORM предпочтительнее SQL.

3 Solutions collect form web for “Django: Конверс `__endswith`”

Django ORM не является серебряной пулей, нет ничего плохого в написании частей SQL в случае, если обработка с простой ORM затруднена или невозможна. Это действительно хороший вариант использования extra() :

 Entry.objects.extra(where=['"hello" LIKE CONCAT("%%", name)']) 

Обратите внимание, что, поскольку мы пишем простой SQL здесь, это будет иметь отношение к базе данных в любом случае. Это конкретный тип mysql, основанный на этом вопросе: MySQL: что такое обратная версия LIKE? , Должен работать и для PostgreSQL (не тестировался).

Обратите внимание, что вы можете адаптировать запрос к пользовательскому Lookup запросу повторно (введенный в Django 1.7):

  • представьте, что у вас есть следующая модель

     class MyModel(models.Model): name = models.CharField(max_length=100) def __unicode__(self): return self.name 
  • определить класс Lookup с as_sql() методом as_sql() :

     class ConverseEndswith(models.Lookup): lookup_name = 'ce' def as_sql(self, qn, connection): lhs, lhs_params = self.process_lhs(qn, connection) rhs, rhs_params = self.process_rhs(qn, connection) params = lhs_params + rhs_params return '%s LIKE CONCAT("%%%%", %s)' % (rhs, lhs), params models.Field.register_lookup(ConverseEndswith) 
  • то вот как наш пользовательский поиск __ce работает в shell :

     >>> import django >>> django.setup() >>> from myapp.models import MyModel >>> for name in ['hello', 'ello', 'llo', 'test1', 'test2']: ... MyModel.objects.create(name=name) >>> MyModel.objects.filter(name__ce='hello') [<MyModel: hello>, <MyModel: ello>, <MyModel: llo>] >>> MyModel.objects.filter(name__ce='hello').query.__str__() u'SELECT `myapp_mymodel`.`id`, `myapp_mymodel`.`name` FROM `myapp_mymodel` WHERE hello LIKE CONCAT("%", `myapp_mymodel`.`name`)' 

Другой вариант – сделать проверку в Python. Поскольку запрос LIKE будет выполнять полное сканирование по всем записям внутри таблицы Entry , вы можете получить их все и проверить один за другим, используя endswith() Python:

 [entry for entry in Entry.objects.all() if 'hello'.endswith(entry.name)] 

Если у вас есть возможность использовать Django 1.7, вы можете использовать собственные поисковые запросы . В противном случае, я думаю, вам нужно прибегать к использованию .extra или .raw .

вероятно, что-то вроде того, как вы собираетесь получить … хотя его меньше, чем просто потрясающий

 target_string = "hello" chair = Chair.objects.filter(name__in=[target_string[-i:] for i in range(len(target_string))]) 
  • django rest framework вложенные modelserializer
  • Ajax succesfull call show div с данными формы
  • Могут ли модели Django использовать функции MySQL?
  • Настройка двух разных типов пользователей в Django 1.5 / 1.6
  • Хорошая практика для гибкой страницы поиска - Django
  • Определите, является ли атрибут `DeferredAttribute` в django
  • Почему я не могу зарегистрировать несколько Django ModelAdmin с той же моделью?
  • Как правильно форматировать объект StringIO (python и django) для вставки в базу данных?
  • Python - лучший язык программирования в мире.