Django:与“uuu endswith”相反`

2024-05-29 04:52:29 发布

您现在位置:Python中文网/ 问答频道 /正文

Django允许我这样做:

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

但我想这么做:

^{pr2}$

我知道查找__isendof不存在。但我想要这样的东西。我希望它是__endswith的相反。它应该找到所有这样的椅子'hello'.endswith(chair.name)。在

可能在Django?ORM操作优于SQL操作。在


Tags: djangonamehellosqlobjectsormfilter椅子
3条回答

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中引入):

  • 假设您有以下模型

    ^{2美元
  • 使用实现的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查找在^{}中的工作原理如下:

    >>> 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)]    

可能是像你会得到的一样接近。。。尽管它不那么可怕

target_string = "hello"
chair = Chair.objects.filter(name__in=[target_string[-i:] for i in range(len(target_string))])

如果您有可能使用django1.7,那么可以使用custom lookups。否则,我认为您必须使用.extra或{}。在

相关问题 更多 >

    热门问题