2024-05-29 04:52:29 发布
网友
Django允许我这样做:
chair = Chair.objects.filter(name__endswith='hello')
但我想这么做:
我知道查找__isendof不存在。但我想要这样的东西。我希望它是__endswith的相反。它应该找到所有这样的椅子'hello'.endswith(chair.name)。在
__isendof
__endswith
'hello'.endswith(chair.name)
可能在Django?ORM操作优于SQL操作。在
Django-ORM并不是一颗灵丹妙药,如果用普通ORM处理困难或不可能的话,编写部分SQL也没有什么错。这是^{}的一个非常好的用例:
Entry.objects.extra(where=['"hello" LIKE CONCAT("%%", name)'])
请注意,由于我们在这里编写纯SQL,因此它将是特定于数据库后端的。这个细节是mysql特有的,基于这个主题:MySQL: What is a reverse version of LIKE?。应该也适用于PostgreSQL(尚未测试)。在
请注意,您可以将查询调整为可重用的custom ^{}(在Django 1.7中引入):
假设您有以下模型
使用实现的as_sql()方法定义Lookup类:
as_sql()
Lookup
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查找在^{}中的工作原理如下:
__ce
>>> 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()获取所有记录并逐个检查:
LIKE
Entry
endswith()
[entry for entry in Entry.objects.all() if 'hello'.endswith(entry.name)]
可能是像你会得到的一样接近。。。尽管它不那么可怕
target_string = "hello" chair = Chair.objects.filter(name__in=[target_string[-i:] for i in range(len(target_string))])
如果您有可能使用django1.7,那么可以使用custom lookups。否则,我认为您必须使用.extra或{}。在
.extra
Django-ORM并不是一颗灵丹妙药,如果用普通ORM处理困难或不可能的话,编写部分SQL也没有什么错。这是^{} 的一个非常好的用例:
请注意,由于我们在这里编写纯SQL,因此它将是特定于数据库后端的。这个细节是mysql特有的,基于这个主题:MySQL: What is a reverse version of LIKE?。应该也适用于PostgreSQL(尚未测试)。在
请注意,您可以将查询调整为可重用的custom ^{} (在Django 1.7中引入):
假设您有以下模型
^{2美元使用实现的
as_sql()
方法定义Lookup
类:接下来,我们的自定义} 中的工作原理如下:
__ce
查找在^{另一个选择是签入Python。由于
LIKE
查询将对Entry
表中的所有记录进行全面扫描,因此可以使用Python的endswith()
获取所有记录并逐个检查:可能是像你会得到的一样接近。。。尽管它不那么可怕
如果您有可能使用django1.7,那么可以使用custom lookups。否则,我认为您必须使用}。在
.extra
或{相关问题 更多 >
编程相关推荐