Модели Django избегают дубликатов

В моделях:

class Getdata(models.Model):
    title = models.CharField(max_length=255)
    state = models.CharField(max_length=2, choices=STATE, default="0")
    name = models.ForeignKey(School)
    created_by = models.ForeignKey(profile)

    def __unicode__(self):
        return self.id()

В шаблонах:

<form>
    <input type="submit" value="save the data" />
</form> 

Если пользователь нажимает на кнопку сохранения, и вышеупомянутые данные сохраняются в таблице, как избежать дубликатов, т.е. если пользователь снова нажимает на ту же кнопку отправки не должно быть другой записи для тех же значений. Или это - что-то, что должно быть обработано в представлениях?

7
задан tar 3 December 2013 в 06:00
поделиться

2 ответа

Если отдельное поле должно быть уникальным, вы просто добавляете unique = True :

class Getdata(models.Model):
    title = models.CharField(max_length=255, unique=True)
    state = models.CharField(max_length=2, choices=STATE, default="0")
    name = models.ForeignKey(School)
    created_by = models.ForeignKey(profile)

Если вы хотите, чтобы комбинация полей была уникальной, вам нужно unique_topting :

class Getdata(models.Model):
    title = models.CharField(max_length=255)
    state = models.CharField(max_length=2, choices=STATE, default="0")
    name = models.ForeignKey(School)
    created_by = models.ForeignKey(profile)
    class Meta:
        unique_together = ["title", "state", "name"]
30
ответ дан 6 December 2019 в 05:42
поделиться

Предложенный метод unique_together также является лучшим способом, но если он не подходит для ваших нужд, вы можете обработать его в чистом методе вашей формы. например

def clean(self):
   try:
      Getdata.objects.get(title=self.cleaned_data['title'], 
                          state=self.cleaned_data['state'],
                          name=self.cleaned_data['name'],
                          created_by=self.cleaned_data['created_by'] )
      #if we get this far, we have an exact match for this form's data
      raise forms.ValidationError("Exists already!")
   except Getdata.DoesNotExist:
      #because we didn't get a match
      pass

   return self.cleaned_data
2
ответ дан 6 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: