Django模型避免重复

21 投票
4 回答
31041 浏览
提问于 2025-04-16 00:03

在模型中:

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> 

如果用户点击保存按钮,并且上述数据被保存到表格中,怎么才能避免重复的记录?也就是说,如果用户再次点击同样的提交按钮,就不应该再为相同的值创建另一条记录。这个问题是需要在视图中处理吗?

4 个回答

0

我觉得用Jquery或JS代码来隐藏保存按钮是个不错的主意。

你可以创建一个叫做custom_validate.js的文件,内容如下,然后把它放在static文件夹里(也就是静态文件的目录)。

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

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

接着,在admin.py文件里,添加下面的代码。

class CustomDataForm(forms.ModelForm):

    class Meta:
        model = GetData

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

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

这里提到的unique_together是一个很好的方法,可以确保某些字段的组合是唯一的。不过,如果这个方法不适合你的需求,你也可以在表单的clean方法里处理这个问题。比如:

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
54

如果某个字段需要是唯一的,你只需要加上 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_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"]

撰写回答