Django models avoid duplicates

耗尽温柔 提交于 2019-11-27 21:02:21

问题


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?


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



回答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



回答3:


I think injecting a Jquery/JS code to hide the save button would be a good idea.

Create a custom_validate.js file like below and place it in directory static(static file directory)

if (!$) {
    $ = django.jQuery;
}

$( document ).ready(function() {
    $("[name=_save]").click(function() {
       $("[name=_save]").css("visibility", "hidden");
    });
});

And in admin.py, add the below code.

class CustomDataForm(forms.ModelForm):

    class Meta:
        model = GetData

class GetDataAdmin(admin.ModelAdmin):
    # ....
    .....
    form = CustomDataForm

    class Media:
        js = ('/static/custom_validate.js', )


来源:https://stackoverflow.com/questions/3052975/django-models-avoid-duplicates

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!