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

贾瑞特·杜斯基

我有一个像这样的模型:

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进行全文搜索。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法防止 RethinkDB 自动生成的 ID 字段中出现连字符?

来自分类Dev

查询Django模型时,有没有办法匹配字段中的每个字符串

来自分类Dev

有没有办法忽略uTest中的测试?

来自分类Dev

有没有办法忽略hg责备的提交?

来自分类Dev

有没有办法忽略Gson中的JsonSyntaxException

来自分类Dev

有没有办法忽略uTest中的测试?

来自分类Dev

在使用c ++读取文件时,有没有办法忽略文件字符的结尾?

来自分类Dev

有没有办法过滤Twilio呼叫日志?

来自分类Dev

有没有办法过滤Twilio呼叫日志?

来自分类Dev

有没有办法动态过滤事件日志?

来自分类Dev

有没有办法“杀死”模型财产?

来自分类Dev

有没有办法自动对模型应用限制?

来自分类Dev

有没有办法以Django形式动态过滤查询集以确保外键正确?

来自分类Dev

有没有办法在Django中建立动态模型?

来自分类Dev

有没有办法让 Django 管理自定义模型架构

来自分类Dev

有没有办法在django模型的CharField中设置默认值?

来自分类Dev

有没有办法在 Django 中添加模型值?

来自分类Dev

有没有办法将 WriteLine 存储到字符串变量中?

来自分类Dev

有没有办法让numpy矩阵存储对象?

来自分类Dev

有没有办法获取存储过程签名?

来自分类Dev

Android/Java:有没有办法存储方法?

来自分类Dev

有没有办法覆盖unicode字符?

来自分类Dev

有没有办法在 Django 中伪造 fk

来自分类Dev

有没有办法表明字符串模型属性在Swagger中具有最大长度?

来自分类Dev

有没有办法从单独的文件中获取存储在页面对象模型之后的元素的 xpath?

来自分类Dev

有没有办法在忽略空格的情况下使用OrderBy对字符串进行排序?

来自分类Dev

有没有办法将mariadb与python2.7连接

来自分类Dev

有没有办法安排Windows 10连接到互联网

来自分类Dev

有没有办法回答(或忽略)所有y / n提示“ y”?

Related 相关文章

  1. 1

    有没有办法防止 RethinkDB 自动生成的 ID 字段中出现连字符?

  2. 2

    查询Django模型时,有没有办法匹配字段中的每个字符串

  3. 3

    有没有办法忽略uTest中的测试?

  4. 4

    有没有办法忽略hg责备的提交?

  5. 5

    有没有办法忽略Gson中的JsonSyntaxException

  6. 6

    有没有办法忽略uTest中的测试?

  7. 7

    在使用c ++读取文件时,有没有办法忽略文件字符的结尾?

  8. 8

    有没有办法过滤Twilio呼叫日志?

  9. 9

    有没有办法过滤Twilio呼叫日志?

  10. 10

    有没有办法动态过滤事件日志?

  11. 11

    有没有办法“杀死”模型财产?

  12. 12

    有没有办法自动对模型应用限制?

  13. 13

    有没有办法以Django形式动态过滤查询集以确保外键正确?

  14. 14

    有没有办法在Django中建立动态模型?

  15. 15

    有没有办法让 Django 管理自定义模型架构

  16. 16

    有没有办法在django模型的CharField中设置默认值?

  17. 17

    有没有办法在 Django 中添加模型值?

  18. 18

    有没有办法将 WriteLine 存储到字符串变量中?

  19. 19

    有没有办法让numpy矩阵存储对象?

  20. 20

    有没有办法获取存储过程签名?

  21. 21

    Android/Java:有没有办法存储方法?

  22. 22

    有没有办法覆盖unicode字符?

  23. 23

    有没有办法在 Django 中伪造 fk

  24. 24

    有没有办法表明字符串模型属性在Swagger中具有最大长度?

  25. 25

    有没有办法从单独的文件中获取存储在页面对象模型之后的元素的 xpath?

  26. 26

    有没有办法在忽略空格的情况下使用OrderBy对字符串进行排序?

  27. 27

    有没有办法将mariadb与python2.7连接

  28. 28

    有没有办法安排Windows 10连接到互联网

  29. 29

    有没有办法回答(或忽略)所有y / n提示“ y”?

热门标签

归档