Состояние в модели Джанго - PullRequest
0 голосов
/ 02 января 2019

Я хочу, чтобы company_name было unique=True, когда company_is_deleted=False.Аналогично, когда company_is_deleted=True, тогда company_name будет unique=False.Использование мягкого удаления означает, что я просто устанавливаю company_is_deleted=True, а не удаляю его из таблицы базы данных.

Модель компании

class Company(models.Model):
    company_name = models.CharField(max_length=20, unique=True) # Here
    company_description = models.CharField(max_length=100)
    company_address = models.CharField(max_length=100)
    company_email = models.EmailField()
    company_website = models.URLField()
    company_phone = models.CharField(max_length=30)
    company_monthly_payment = models.DecimalField(max_digits=5, decimal_places=2)
    company_logo = models.ImageField(upload_to='company_logo', default='default_company.png',blank=True, null=True)
    company_created = models.DateTimeField(auto_now_add=True)
    company_is_deleted = models.BooleanField(default=False)

View.py

class CompanyCreateView(LoginRequiredMixin, generic.CreateView):
    model = Company
    fields = ['company_name', 'company_description', 'company_email', 
    'company_website', 'company_address', 'company_phone', 'company_status', 
    'company_monthly_payment', 'company_logo']

1 Ответ

0 голосов
/ 02 января 2019

Вы можете добавить эту логику в метод save.Но удалите unique из поля company_name.

from django.db import IntegrityError


class Company(models.Model):
    company_name = models.CharField(max_length=20)
    company_description = models.CharField(max_length=100)
    company_address = models.CharField(max_length=100)
    company_email = models.EmailField()
    company_website = models.URLField()
    company_phone = models.CharField(max_length=30)
    company_monthly_payment = models.DecimalField(max_digits=5, decimal_places=2)
    company_logo = models.ImageField(upload_to='company_logo', default='default_company.png',blank=True, null=True)
    company_created = models.DateTimeField(auto_now_add=True)
    company_is_deleted = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if not self.company_is_deleted and Company.objects.filter(
            company_name=self.company_name, 
            company_is_deleted=False
        ).exists():
            raise IntegrityError    
        super(Company, self).save(*args, **kwargs)
...