gpt4 book ai didi

python - Django:有没有办法过滤模型并忽略存储的连字符?

转载 作者:行者123 更新时间:2023-12-04 10:46:24 25 4
gpt4 key购买 nike

我有一个像这样的模型:

class Product(models.Model):
name = models.CharField(max_length=5)

名称的一个例子是:A-123

无论如何要过滤此名称字段,以便我可以输入连字符或将其省略,并获得相同的结果?例如,查询“A-123”和“A123”将返回相同的项目。使用常规过滤器时,我只会在执行“A-123”时得到结果。

如果没有,最好的解决方案是制作一个填充辅助“可搜索”字段的 on_save 触发器吗?

这将是我最初的想法,但我担心这会效率低下。

我考虑过的另一种方法是拉出所有对象,然后循环并删除连字符以找到匹配项,但我再次担心性能问题/效率。

最佳答案

添加具有规范化名称的字段将是一个明智的解决方案,尽管我会通过覆盖 .save() 来填充它。在 Product模型。

class Product(models.Model):
name = models.CharField(max_length=5)
normalized_name = models.CharField(max_length=5)

def save(self, *args, **kwargs):
self.normalized_name = self.normalize_name(name)
super().save(*args, **kwargs)

@classmethod
def normalize_name(cls, name):
return name.replace('-', '') # Maybe also remove spaces?


Product.objects.filter(normalized_name=Product.normalize_name('A-123'))
Product.objects.filter(normalized_name=Product.normalize_name('A123'))

如果您在多个地方使用它,您可能需要创建一个自定义管理器以避免代码重复:
class ProductManager(models.Manager):

def filter_by_normalized_name(name):
normalized_name = Product.normalize_name('A-123')
return self.get_queryset().filter(normalized_name=normalized_name)


class Product(models.Model):

...
objects = ProductManager

Product.objects.filter_by_normalized_name('A123')
Product.objects.filter_by_normalized_name('A-123')

或者,如果 Product.name始终具有相同的结构,您可以标准化您的搜索词。

例如。如果您知道名称的第二个字符总是带有连字符:
if search_term[1] != '-':
search_term = f"{search_term[0]}-{search_term[1:]}"

对于更详细的解决方案,您可能需要使用 PostgreSQL 或 ElasticSearch 进行全文搜索。

关于python - Django:有没有办法过滤模型并忽略存储的连字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59684315/

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