2011-05-31 67 views
0

假设具有两个字段的django模型: - 创建 - 修改 每个字段都是整数,唯一并且值不断增加。一个对象在第一次保存时应该具有相同的创建和修改值,并且修改后的字段应该在每次保存时增加到大于自身的下一个空闲值。避免custon 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, *args, **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, *args, **kwargs): 
     self.update_on_each_save = True 
     CreatedVerisonField.__init__(self, args, kwargs) 

使用这些领域的一个简单的测试类:

class TestModel(models.Model): 
    created = CreatedVerisonField() 
    modified = ModifiedVersionField() 

当创建和保存从多个线程“TestModel”的对象,我由于唯一约束而导致IntegretyError被违反。寻找pre_save代码,很显然这个比赛存在。我该如何解决?

回答