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

dem*_*mhm 7 mysql sql django django-models django-orm

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

SELECT * FROM model_table WHERE MD5(field) = 'my value';
Run Code Online (Sandbox Code Playgroud)

dan*_*era 8

你有两种方式:

第一种方式:额外

额外方法: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)
Run Code Online (Sandbox Code Playgroud)

优点:快速的表现.

缺点:需要更改数据库.

编辑:在python3使用

...
super().save(*args, **kwargs)
...
Run Code Online (Sandbox Code Playgroud)

代替:

...
super(Model, self).save(*args, **kwargs)
...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。这是我们最好的。我选择第一个,将 dict 传递给 'where' kwarg。Fullscan 被其他正在索引的 where 条件避免。重要的是我们不能使用 .get() 模型方法向请求添加更多条件。最终版本是: Entry.objects.filter(**conditions).extra(where={'MD5(field)': 'my value'}) (2认同)