如何为Django模型生成哈希

11

我正在尝试为我的Django模型生成10位唯一的哈希值,我尝试了这些方法,但出现了错误。

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个回答

14

不要在字段中调用_createHash()函数,而只需将可调用对象的引用传递到您的模型中,例如:

不要在字段中调用_createHash()函数,而只需将可调用对象的引用传递到您的模型中,例如:

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

正如Lennart Regebro在他的答案中提到的那样,您在尝试启动服务器时每次都会获得相同的值。

Django文档对此有以下解释:

Field.default

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


你说得没错,但如果我想将参数传递给方法_createHash(),我该怎么做呢? - Vaibhav Jain
例如,我有一个方法 def _generateSEOURL(pattern,StringToconcatenate): return pattern + StringToconcatenate ,我想传递 seo_url1 = models.URLField(default=_generateSEOURL("discounts-in-",tag)) 这样的参数...来将一些字符串连接到每个标签值上,那么我该怎么做呢? - Vaibhav Jain
你可能需要创建一个包装函数,其中包含您想要传递的参数...def _createHashForModel(): return _createHash(10) 然后 default=_createHashForModel - ilovett

5

_createHash() 在定义模型时被调用,这样每次创建新对象时都有相同的默认值。

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


嗨@Lennart_Regebro,我们如何在save()方法内使用它? - Abdul Rehman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接