如何将 md5 函数应用于 django orm 中的字段?

Posted

技术标签:

【中文标题】如何将 md5 函数应用于 django orm 中的字段?【英文标题】:How to apply md5 function to field in django orm? 【发布时间】:2014-10-20 22:21:07 【问题描述】:

如何在不使用 objects.raw() 方法的情况下从模型生成此 sql 查询?数据库是 mysql

SELECT * FROM model_table WHERE MD5(field) = 'my value';

【问题讨论】:

【参考方案1】:

你有两种方法:

第一种方式:额外

Extra 方法:Entry.objects.extra(where=["MD5(field) = 'my value'"])

优点:快速编码。

缺点:索引不友好、全扫描、性能差。

第二种方式:新领域

在模型上添加新字段field_md5 并将其设置为save

import hashlib
myModel(models.Model):
    field = models.CharField(max_length=30)
    field_md5 = models.CharField(max_length=16, editable = false )

    def save(self, *args, **kwargs):        
        self.field_md5 = hashlib.md5.new(self.field).digest()
        super(Model, self).save(*args, **kwargs)

优点:性能快速。

缺点:需要更改数据库。

编辑:在 python3 中使用

...
super().save(*args, **kwargs)
...

代替:

...
super(Model, self).save(*args, **kwargs)
...

【讨论】:

谢谢。这是我们最好的选择。我选择第一个,将 dict 传递给 'where' kwarg。其他索引条件可以避免全扫描。重要的是我们不能使用 .get() 模型方法来为请求添加更多条件。最终版本是:Entry.objects.filter(**conditions).extra(where='MD5(field)': 'my value')

以上是关于如何将 md5 函数应用于 django orm 中的字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Django 频道会话分配给 ORM 中的对象?

day17-django的ORM与其他

django ORM:shell和应用程序之间的过滤结果不同

如何在不创建 django 项目的情况下使用 Django 1.8.5 ORM?

将 djongo (Mongo ORM) 集成到 Django Rest 框架中

django -2 ORM模型