2013-10-20 28 views
0

這裏是我的模型:獨特只依賴於一個一對一的關係

class ActIds(models.Model): 
    #no_celex for index_ids must be unique 
    no_celex=models.CharField(max_length=15, blank=True, null=True) 

class Act(models.Model): 
    index_ids=models.OneToOneField(ActIds, related_name='index_ids') 
    eurlex_ids=models.OneToOneField(ActIds, related_name='eurlex_ids') 
    oeil_ids=models.OneToOneField(ActIds, related_name='oeil_ids') 

我想現場no_celex是唯一ONLY,如果它「來自」 index_ids。怎麼做?

更多的解釋:

這必須是不可能

act=Act() 
act.index_ids.no_celex="test" 
act.save() 
act2=Act() 
act2.index_ids.no_celex="test" 
act2.save() 

但這可能是可能

act=Act() 
act.index_ids.no_celex="test" 
act.eurlex_ids.no_celex="test" 
act.save() 

,這可以是可能太:

act=Act() 
act.index_ids.no_celex="test" 
act.save() 
act2=Act() 
act2.eurlex_ids.no_celex="test" 
act2.save() 

這裏是我的(僞)到目前爲止的代碼:

class ActIdsForm(forms.ModelForm): 
    class Meta: 
     model=ActIds 

    def is_valid(self): 
     valid=super(ActIdsForm, self).is_valid() 

     if not valid: 
      return valid 

     no_celex=self.cleaned_data.get("no_celex") 

     try: 
      #does the no_celex already exist? 
      act=Act.objects.get(index_ids.no_celex=no_celex) 
      #if yes, is it the act being saved (ok) or another act (error)? 
      if act.index_ids.id!="id of the act being saved": 
       print "pb no_celex already exists" 
       self._errors['no_celex']=ErrorList([u"no_celex already exists!"]) 
       return False 
    except: 
       pass 

     return True 

我的問題:我怎樣才能得到當前行爲的ID(從我ActIds模型)?這是一個更新的形式...

+0

我剛加了我的代碼。 – rom

回答

1

你有沒有考慮在你的模型上寫自己的保存和清理方法,以強制執行你想要的邏輯?

讓您的保存方法調用完全清潔(這將調用您的自定義清潔)。

def clean(self): 
    # check for stuff to help with conditions 
    if <my conditions are not met>: 
     raise ValidationError('%s is not a valid Model. Please follow the rules') 

def save(self, *args, **kwargs): 
    self.full_clean() 
    super(MyModel, self).save(*args, **kwargs) 
+0

你的意思是我不能/不應該在我的'ActIdsForm'的'is_valid'方法中做這樣的驗證? – rom

+0

我不確定,我通常在我的模型中執行它,然後通過REST API將它們暴露爲沒有窗體的json。 – mconlin

+0

好的。比方說,我使用模型。我如何獲得當前對象的ID? – rom

相關問題