如何解决避免在custon Django字段中发生IntegrityError
|| 假设有两个字段的Django模型: -创建 -修改 每个字段都是整数,其值唯一且不断增加。第一次保存时,对象应具有相同的创建和修改值,并且每次保存时,应将修改后的字段创建为大于其自身的下一个空闲值。 我为此创建了以下字段:class CreatedVerisonField(models.BigIntegerField):
update_on_each_save = False
def __init__(self,*args,**kwargs):
kwargs.setdefault(\'editable\',False)
kwargs.setdefault(\'blank\',True)
kwargs.setdefault(\'unique\',True)
models.BigIntegerField.__init__(self,**kwargs)
def pre_save(self,model,add):
if add or self.update_on_each_save:
value = self.get_next_value(model)
setattr(model,self.attname,value)
return value
else:
return super(CreatedVerisonField,self).pre_save(model,add)
def get_next_value(self,model):
objs = model.__class__.objects.all()
fields = self._get_fields(model)
if objs:
# new version is max of all version fields + 1
value = max(objs.aggregate(*map(lambda x: Max(x),fields)).values()) + 1
else:
value = 1
return value
def _get_fields(self,model):
fields = []
for f in model._meta.fields:
if isinstance(f,CreatedVerisonField):
fields.append(f.db_column if f.db_column else f.name)
return fields
class ModifiedVersionField(CreatedVerisonField):
def __init__(self,**kwargs):
self.update_on_each_save = True
CreatedVerisonField.__init__(self,args,kwargs)
使用这些字段的简单测试类:
class TestModel(models.Model):
created = CreatedVerisonField()
modified = ModifiedVersionField()
从多个线程创建和保存\“ TestModel \”对象时,由于违反了unique-constraint,我收到IntegretyError。看一下添加pre_save代码,很明显这个种族存在。我该如何解决?
解决方法
进行线程安全的数据库访问的唯一方法是在访问之前锁定表。在网上进行的粗略搜索显示了以下代码段:http://djangosnippets.org/snippets/2039/。也许您可以这样做。 Django文档中有关事务的部分也将对您有用:https://docs.djangoproject.com/en/dev/topics/db/transactions/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。