如何为Django模型生成HASH

时间:2013-05-31 09:14:26

标签: python django

我正在尝试为我的10位数的Django模型生成唯一的HASH值我已尝试过这些方法但是我收到此错误

return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: column hash_3 is not unique

这是我尝试过的:

import os
import time
import hashlib
from os import path
from binascii import hexlify
from django.db import models
from django.contrib import admin
from django.core.files.storage import FileSystemStorage
#------------------------------------------------------------------------------ 

def _createHash():
    """This function generate 10 character long hash"""
    hash = hashlib.sha1()
    hash.update(str(time.time()))
    return  hash.hexdigest()[:-10]


class tags(models.Model):
    """ This is the tag model """

    seo_url1 = models.URLField()
    seo_url2 = models.URLField()
    seo_url3 = models.URLField()
    tagDescription = models.TextField()                 # Tag Description
    tag = models.CharField(max_length=200)              # Tag name
    tagSlug = models.CharField(max_length=400)          # Extra info can be added to the existing tag using this field
    updatedAt = models.DateTimeField(auto_now=True)     # Time at which tag is updated
    createdAt = models.DateTimeField(auto_now_add=True) # Time at which tag is created
    hash_1 = models.CharField(max_length=10,default=_createHash(),unique=True)
    hash_2 = models.CharField(max_length=10,default=_createHash(),unique=True)
    hash_3 = models.CharField(max_length=10,default=_createHash(),unique=True)

我也尝试过这种方法:

def _createHash():
    """This function generate 10 character long hash"""
    return hexlify(os.urandom(5))

我有一个脚本,每次运行我的脚本时都会将数据插入到此模型中我得到了上面提到的错误..还有其他方法可以做到这一点..我想将唯一的哈希值存储到列hash_1,hash_2,hash_3

2 个答案:

答案 0 :(得分:9)

不要在你的字段中调用_createHash()函数,而只是将引用传递给模型中的callable,例如

hash_1 = models.CharField(max_length=10,default=_createHash,unique=True)

正如Lennart Regebro在他的回答中提到的,每次启动服务器时,你都会得到相同的值。

Django docs这样说:

  

Field.default

     

字段的默认值。这可以是价值或   一个可调用的对象。如果是可调用的,则每次调用时都会调用它   对象已创建。

答案 1 :(得分:4)

定义模型时会调用

_createHash(),因此每次创建新对象时都会使用相同的默认值。

您可以在模型的save()方法中查看创建哈希值,这可能是最简单的。