2017-05-25 86 views
0

型号:如何覆盖保存方法以更改Django中的数据?

ATTN_TYPE_CHOICES = (
    ('N', 'Entry'), 
    ('X', 'Exit'), 
    ('L', 'Leave'), 
) 


class Attn(Timestamp): 
    emp_id = models.CharField(
     max_length=10 
    ) 
    date = models.DateField() 
    time = models.TimeField(
     default=time(00, 00) 
    ) 
    type = models.CharField(
     max_length=1, 
     choices=ATTN_TYPE_CHOICES, 
     default='N' 
    ) 

    @property 
    def late(self): 
     return type == 'N' and self.time > LATE_LIMIT 

    def save(self, *args, **kwargs): 
     try: 
      Attn.objects.get(emp_id=self.emp_id, date=self.date, type='N') 
     except Attn.DoesNotExist: 
      pass 
     else: 
      try: 
       exit = Attn.objects.get(emp_id=self.emp_id, date=self.date, type='X') 
      except Attn.DoesNotExist: 
       self.type = 'X' 
      else: 
       exit.delete() 
     super(Attn, self).save(*args, **kwargs) 

    class Meta: 
     unique_together = ('emp_id', 'date', 'type') 

我会创建对象三次。第一次很简单。该类型将是N。第二次,我想要保存方法来检查类型N是否已经存在,如果是,则将类型更改为“X”并保存第二个对象。第三次,我希望它检查N,然后再检查X。但是这一次它会找到X,并且会在保存X类型的新条目之前删除X的现有条目。

由于某些原因,代码似乎卡在unique_together,并且不让我保存管理面板中的数据。我是否应该尝试着解决Integrityerror这个问题?尝试编辑保存这样的方法,

def save(self, *args, **kwargs): 
    try: 
     Attn.objects.get(emp_id=self.emp_id, date=self.date, type='N') 
     try: 
      exit = Attn.objects.get(emp_id=self.emp_id, date=self.date, type=='X') 
      exit.delete()     
     except Attn.DoesNotExist: 
      self.type = 'X' 
     else: 
      self.type = 'X' 
    except Attn.DoesNotExist: 
     self.type = 'N' 

    return super(Attn, self).save(*args, **kwargs) 

取出unique_together约束,它不是现在需要

回答

1

,你明确地重写保存方法,限制应用程序保存的对象与上述条件..

编辑

docs

违反约束时在模型验证期间引发的ValidationError具有unique_together错误代码。

这意味着,如果违反了unique_together约束,那么将在模型验证本身中引发ValidationError。如果约束失败,Django甚至不会尝试接近保存方法。因此,在将对象提交给数据库之前,django-admin会产生错误。

+0

没有。同样的错误。看来由于'unique_together',django admin阻止我保存另一个类型为'N'的条目。 – MiniGunnR

+1

删除unique_together约束,现在不需要它,你显式重写save方法并限制应用程序使用上面的条件保存对象...删除约束,它应该工作.. – zaidfazil

+0

你能解释为什么我不能保留它?为什么在保存方法完成之前触发? – MiniGunnR

相关问题