Django models avoid duplicates

22,778

Solution 1

If an individual field needs to be unique, then you just add 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)

If you want a combination of fields to be unique, you need unique_together:

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"]

Solution 2

The unique_together also suggested is the best way, but if that's not appropriate for your needs, you can handle it in your form's clean method. eg

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
Share:
22,778
Hulk
Author by

Hulk

Updated on July 09, 2022

Comments

  • Hulk
    Hulk almost 2 years

    In models:

    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()
    

    In templates:

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

    If the user clicks on the save button and the above data is saved in the table, how to avoid the duplicates, i.e. if the user again clicks on the same submit button there should not be another entry for the same values. Or is it something that has to be handled in views?