如何将 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:shell和应用程序之间的过滤结果不同
如何在不创建 django 项目的情况下使用 Django 1.8.5 ORM?