【问题标题】:How to prevent duplicate entries in model from django admin如何防止来自 django admin 的模型中的重复条目
【发布时间】:2013-12-13 01:57:22
【问题描述】:

我有一个应用程序,其模型名为 Verifications。它具有以下字段:asset_code、Status、Location、Emp_id 等。我可以使用 django 管理面板中的“添加验证”添加验证。但我想限制添加重复的asset_code 条目(如果asset_code 已经存在)。

class Verification(models.Model):
    asset_code = models.CharField(verbose_name="Asset Code",max_length=16, default="")
    scan_time = models.DateTimeField(verbose_name="Time of smartDNA scan",auto_now_add=True,default=datetime.datetime.now)
    credential = models.CharField(verbose_name="smartDNA Credential",max_length=16, default="")
    status = models.IntegerField(verbose_name="Scanning Status",choices=STATUS_CHOICES,default=1)
    operator = models.CharField(verbose_name="Operator",max_length=16, default="")
    location = models.CharField(verbose_name="Branch",max_length=64, default="")
    auth_code = models.CharField(verbose_name="Scanner Authentication",max_length=20, default="DSC(Verisign")
    emp_id = models.CharField(verbose_name="EMP ID",max_length=16, default="")
    image = models.CharField(verbose_name="Image",max_length=24, default="dd")
    created = models.DateTimeField(verbose_name="Created on",blank=True,auto_now_add=True)
    modified = models.DateTimeField(verbose_name="Modified on",blank=True,auto_now=True)
    product_details = models.CharField(verbose_name="Product Details",max_length=64, default="")

状态字段的值可以在 1 到 10 之间。

如果asset_code 已经存在并且status=1,我如何防止在模型中添加条目。

【问题讨论】:

    标签: python mysql django django-forms django-validation


    【解决方案1】:

    unique=True 添加到asset_code 字段定义

    更新:

    仅供管理员使用:

    admin.py

    from django import forms
    
    class VerificationAdminForm(forms.ModelForm):
        class Meta:
            model = Verification
    
        def clean_asset_code(self):
            asset_code = self.cleaned_data['asset_code']
            if Verification.objects.filter(asset_code=asset_code).exists():
                raise forms.ValidationError("This asset code already exist.")
            return asset_code
    
    class VerificationAdmin(admin.ModelAdmin):
        form = VerificationAdminForm
    

    【讨论】:

    • 但这将限制来自用户和管理员的所有重复条目。但我只想从管理面板限制它。
    • 感谢 Nikita,它工作正常。但还有一件事,我想同时放置 2 个过滤器。就像asset_code已经存在并且“status=1”一样;那么只有它应该限制。否则,如果asset_code存在并且“状态”是1以外的任何东西,它应该允许添加......
    • 为什么方法名是 clean_ass.. 而不仅仅是clean(self)?这个 python 是否特定于您可以在覆盖时以某种方式命名该方法?
    • @Timo,clean 方法用于整个表单,而 clean_() 方法用于字段,它们具有不同的返回值类型。检查文档 - docs.djangoproject.com/en/1.11/ref/forms/validation
    【解决方案2】:

    您的意思是有两个或多个实例具有相同的资产代码和状态是可以的,只要只有一个具有 status=1 吗?或者asset_code和status的组合应该是唯一的?如果是第二个,那就很简单了:

    class Verification(models.Model):
        # your fields here 
        class Meta:
            unique_together = [("asset_code", "status)]
    

    第一种情况(这将是一个相当奇怪的要求,但无论如何......)涉及更多,您需要数据库中的触发器或模型中的一些自定义验证,参见 https://docs.djangoproject.com/en/1.6/ref/models/instances/#django.db.models.Model.validate_unique

    哦,是的:如果您只想在管理员中防止这种情况,您应该为 ModelAdmin 提供您自己的 ModelForm,并在表单的 clean 方法中编写您的验证。

    【讨论】:

    • 我的意思是如果asset_code是重复的并且status=1那么只有它应该限制。如果 status=other than 1 并且asset_code 是重复的,那么它应该允许该条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多