gpt4 book ai didi

python - Django:匡威 `__endswith`

转载 作者:太空狗 更新时间:2023-10-29 22:30:23 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com