2

我有一个应用程序,其模型名为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 已经存在并且状态= 1,如何防止在模型中添加条目。

4

2 回答 2

7

添加unique=Trueasset_code字段定义

更新:

仅适用于管理员:

管理员.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
于 2013-11-27T12:20:37.557 回答
2

你的意思是有两个或多个实例具有相同的asset_code AND status 是可以的,只要只有一个具有 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方法中编写您的验证。

于 2013-11-27T13:27:52.670 回答