2013-11-27 2 views
0

У меня есть приложение, имеющее модель под названием Verifications. В нем есть поля: asset_code, Status, Location, Emp_id и т. Д. Я могу добавить проверки, используя «Добавить проверку» из панели администрирования django. Но я хочу ограничить добавление повторяющихся записей в файле asset_code (если resource_code уже существует).Как предотвратить дублирование записей в модели от администратора django

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.

ответ

1

добавить unique=True в asset_code определение поля

UPDATE:

только для администратора:

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 
+0

Но это ограничит все повторяющиеся записи от пользователя, а также администратора. Но я хочу ограничить его только административной панелью. – PK10

+0

Я обновил свой ответ – Nikita

+0

Спасибо Nikita, его отлично работает. Но еще одна вещь, я хочу поставить 2 фильтра одновременно. Например, если object_code уже существует и «status = 1»; то только это должно ограничивать. В противном случае, если object_code существует, а «status» - это любая вещь, кроме 1, она должна позволять добавлять ... – PK10

0

Вы имеете в виду наличие двух или более экземпляров с таким же status_code И статус в порядке, если только один имеет статус = 1? Или что комбинация asset_code и статуса должна быть уникальной? Если второе, это довольно просто:

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

Первый случай (который был бы весьма странным требованием, но в любом случае ...) более активное участие, вам необходимо либо триггер в базе данных или какой-либо пользовательской проверки в модель, cf https://docs.djangoproject.com/en/1.6/ref/models/instances/#django.db.models.Model.validate_unique

О да и да: если вы только хотите предотвратить это в администраторе, вы должны вместо этого предоставить свой ModelForm для ModelAdmin и написать свою проверку в методе clean формы.

+0

Я имею в виду, если object_code является дубликатом и status = 1, то только он должен ограничивать. И если status = кроме 1 и object_code является дубликатом, он должен разрешить эту запись. – PK10

Смежные вопросы