- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Django 允许我这样做:
chair = Chair.objects.filter(name__endswith='hello')
但是我想这样做:
chair = Chair.objects.filter(name__isendof='hello')
我知道查找 __isendof
不存在。但我想要这样的东西。我希望它与 __endswith
相反。它应该找到所有满足 'hello'.endswith(chair.name)
的椅子。
在 Django 中可能吗? ORM 操作优于 SQL 操作。
最佳答案
Django ORM 不是 Elixir ,在使用普通 ORM 处理困难或不可能的情况下,编写部分 SQL 并没有错。这是 extra()
的一个非常好的用例:
Entry.objects.extra(where=['"hello" LIKE CONCAT("%%", name)'])
请注意,由于我们在这里编写纯 SQL - 无论如何它都是特定于数据库后端的。这个特别是 mysql 特定的并且基于这个主题:MySQL: What is a reverse version of LIKE? .应该也适用于 PostgreSQL(尚未测试)。
请注意,您可以将查询调整为可重用的 custom Lookup
(在 Django 1.7 中引入):
假设您有以下模型
class MyModel(models.Model):
name = models.CharField(max_length=100)
def __unicode__(self):
return self.name
定义 Lookup
类并实现 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
表中的所有记录进行全面扫描,因此您可以获取所有记录并使用 Python 的 endswith( )
:
[entry for entry in Entry.objects.all() if 'hello'.endswith(entry.name)]
关于python - Django:匡威 `__endswith`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725182/
Django 允许我这样做: chair = Chair.objects.filter(name__endswith='hello') 但是我想这样做: chair = Chair.objects.f
我是一名优秀的程序员,十分优秀!