2011-04-13 160 views
0

我使用Django,因爲我很新,我有一些問題。在Django模型中查詢

我呼籲簽名和我的models.py文件名爲SignatureForm的ModelForm一個模型:

class Signature(models.Model): 

    sig = models.ForeignKey(Device) 
    STATE = models.CharField(max_length=3, choices=STATE_CHOICES) 
    interval = models.DecimalField(max_digits=3, decimal_places=2) 
    verticies = models.CharField(max_length=150) 

class SignatureForm(ModelForm): 

    class Meta: 
     model = Signature 
     widgets = { 
      'verticies': HiddenInput, 
     } 

要使用它,我寫在views.py以下功能:

def SigEditor(request): 
    # If the form has been sent: 
    if request.method == 'POST': 
     form = SignatureForm(request.POST) 
     # If it is valid 
     if form.is_valid(): 
      # Create a new Signature object. 
      form.save() 
      return render_to_response('eQL/sig/form_sent.html') 
     else: 
     return render_to_response('eQL/sig/try_again.html') 
    else: 
     form = SignatureForm() 
    return render_to_response('eQL/sig/showImage.html', {'form' : form}) 

但是,我不想保存所有新簽名。我的意思是,如果用戶引入了設備A和狀態B的新簽名,我想檢查一下我的數據庫中是否有這樣的簽名,將其刪除,然後保存新簽名,以便我只保存一個簽名爲每個設備和狀態。

我已經試過這樣的事情在保存前,但當然不工作:

q = Signature.objects.filter(sig = s, STATE = st) 
if q.count != 0: 
     q.delete() 
     form.save() 
可以

任何人的幫助?謝謝!!

+0

你有製表符和空格的代碼中的一個可怕的組合(之前,我清理了)。這一定會在未來讓你陷入麻煩。使用一個或另一個(最好是空格)。 – 2011-04-13 08:51:49

回答

0

如果你確實想刪除,爲什麼不呢?

Signature.objects.filter(sig=s, STATE=st).delete() 

如果您只想這些項目中的一個組合,你可以使用get_or_create,並在實例傳遞給你的ModelForm

instance, created = Signature.objects.get_or_create(sig=s, STATE=st) 
form = SignatureForm(request.POST, instance=signature) 
# edit instance. 

或者把它放在你的形式保存的邏輯:

class SignatureForm(ModelForm): 
    def save(self, *args, **kwargs): 
     data = self.cleaned_data 
     instance, created = Signature.objects.get_or_create(sig=data['sig'], STATE=data['state']) 
     self.instance = instance 
     super(SignatureForm, self).save(*args, **kwargs) 
+0

那麼,我用: Signature.objects.filter(sig = form.sig,STATE = form.STATE) 但仍然無法正常工作 – noemi 2011-04-13 11:20:12