Django models avoid duplicates

后端 未结 3 2022
醉梦人生
醉梦人生 2020-12-14 12:03

In models:

class Getdata(models.Model):
    title = models.CharField(max_length=255)
    state = models.CharField(max_length=2, choices=STATE, default=\"0\")         


        
相关标签:
3条回答
  • 2020-12-14 12:45

    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
    
    0 讨论(0)
  • 2020-12-14 12:52

    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"]
    
    0 讨论(0)
  • 2020-12-14 12:56

    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', )
    
    0 讨论(0)
提交回复
热议问题