2014-03-29 117 views
0

我有以下模型:獨特的價值問題

class Vehicle(models.Model): 
    name = models.CharField(max_length=180, verbose_name='Nazwa') 
    variant = models.IntegerField(default=0) 
    route = models.ForeignKey(Route) 
    active = models.BooleanField(default=True) 
    class Meta: 
     unique_together = ("name", "variant") 
    def save(self, *args, **kwargs): 
     vehicles = Vehicle.objects.filter(name=self.name).order_by('-variant') 
     try: 
      self.variant = vehicles[0].variant+1 
     except: 
      pass    
     super(Vehicle, self).save(*args, **kwargs) 

的問題是,當我創建新的對象,該名稱不會在數據庫中出現,它創建了variant = 1代替default 0對象。當我創建另一個同名的對象時,variant is incremented by 2 instead of 1
因此,當我創建多個具有相同名稱的對象時,variants僅以奇數顯示,e.g.: 1,3,5,7,9,11... 我的模型出了什麼問題?

+0

因爲你正在做的'車[0] .variant + 1' __and__'超(車輛,個體經營).save(.. 。。保存命令被調用兩次,所以'variant'增加兩次 – sshashank124

回答

1

代碼中的錯誤:您不檢查此模型是否保存過。測試用例:

vehicle = models.Vehicle(name='Foo') 
vehicle.save() #variant==0 by default 
Vehicle.active = False 
vehicle.save() #there is already a record with this name. Increment variant anyway 

這種方法看起來更適合我:

def save(self, *args, **kwargs): 
    if self.id is None: #works only when saved first time 
     self.variant = Vehicle.objects.filter(name=self.name).count() 
    super(Vehicle, self).save(*args, **kwargs)