gpt4 book ai didi

带替换的 Django 过滤器

转载 作者:行者123 更新时间:2023-12-05 08:37:00 29 4
gpt4 key购买 nike

假设我有以下模型,它有一个方法 variants():

class Example(models.Model):
text = models.CharField(max_length=255)

def variants(self):
return Example.objects.filter(text=remove('xy', self.text))

思路是在去除文本中的某些字符后,获取所有文本相同的对象。例如,如果 self.text 是 'axxyy',它应该与文本为 'a' 的对象相匹配。函数 remove() 不触及数据库,它返回一个新的字符串,其中删除了给定的字符。这很好用。

但是,我需要在比较的两边执行相同的操作,这样 variants() 的行为如下:

    def variants(self):
return Example.objects.filter(remove('xy', text)=remove('xy', self.text))

在这种情况下,如果 self.txt 是 'axxyy',它应该与 'a'、'ax、'axx'、'xayy' 等匹配,但不应该与 'aa' 匹配,例如,因为 ' a' != 'aa' 删除后。再一次,我不想从数据库中删除 'xy',只是为了比较。

我可以用 Python 做到这一点,但我想知道是否有办法在数据库级别做到这一点?我一直在阅读有关 Func() 表达式的文档,例如 Replace,但尚未找到解决方案。

最佳答案

使用 django 的 Replace 函数进行注释,然后对该注释进行过滤。

from django.db.models.functions import Replace
from django.db.models import Value
...

def variants(self):
return Example.objects.annotate(
removed_x=Replace('text', Value('x'), Value('')),
removed_xy=Replace('removed_x', Value('y'), Value('')),
).filter(
removed_xy=self.text.replace('x' , '').replace('y', '')
)

请注意,替换参数 Value('') 是可选的,因为它实际上是 Replace() 的默认值,但在示例中更明确。

随着字符数量的增加,这并不能很好地扩展,但如果您的数据库支持正则表达式 (Postgres),可能会有更好的解决方案

关于带替换的 Django 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66996126/

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