Чистый метод модели Django не вызывается при сохранении данных, а работает для других моделей. - PullRequest
0 голосов
/ 28 октября 2019

Итак, у меня есть эта модель, где я храню информацию, которую отправляет моя сущность.

class NewProvisionalEmployeeMail(models.Model):
    offer_id = models.AutoField(primary_key=True)
    email = models.EmailField(max_length=70, null=False, blank=False, unique=False)
    token = models.TextField(blank=False, null=False)
    offer_sent_by = models.CharField(max_length=50)
    position_assigned = models.CharField(max_length=50, null=False, blank=False, default="Developer")


    def __str__(self):
        return str(self.offer_sent_by) +" to " + str(self.email)


    def clean(self):
        if(NewProvisionalEmployeeMail.objects.filter(email=str(self.email)).exists()):
            NewProvisionalEmployeeMail.objects.filter(email=str(self.email)).delete()

Что ожидалось: Прежде чем сохранять данные в этой модели, я ожидаю, что чистый метод будет вызываться автоматически. Я пробовал это с моими другими моделями там, где он работал, но здесь не работал. Это часть, в которой я сохраняю данные.

def sendoffer(request):
    context = {}
    hostname = request.get_host() + "/dummyoffer"
    if request.method=='POST':
        email = request.POST.get('email')
        position = request.POST.get('opt')
        context['success_message'] = "Mail has been sent!!!"
        token = get_secret_key(email)
        msg=EmailMultiAlternatives('ATG',"Hello\n we are from atg.dev.party\n Click on this link to get offer","jecrccanteen@gmail.com",[email])
        message = "http://" + hostname + "/" + token
        msg.attach_alternative(message,"text/html")
        msg.send()
        newusermail = NewProvisionalEmployeeMail(email=email, token=token, offer_sent_by=request.user.username, position_assigned=position)
        newusermail.save()

    return render(request, 'mainapp/offer.html',context)

newusermail.save() - это часть, в которой будут сохраняться данные, и до этого я ожидаю, что будет вызван чистый метод, который проверяет электронную почту, если онуже существует в нашей базе данных, и если она удаляется, мы ее удаляем.

Я знаю, что есть несколько способов добиться этого, но мой вопрос: почему метод clean не вызывается?

РЕДАКТИРОВАТЬ: Когда я переопределяю метод сохранения и явно вызываю чистый метод его работы. Разве чистый метод не вызывается автоматически. Почему мне нужно вызывать его явно.

def save(self, **kwargs):
        self.clean()
        return super(NewProvisionalEmployeeMail, self).save(**kwargs)

Однако он работал нормально для других моих моделей.

РЕДАКТИРОВАТЬ 2: Я знаю, что мы можем сделать это, используяметод сохранения, но мой вопрос - почему он тогда работает для других моих моделей? Например, в одной из моих моделей Works_in работает нормально.

class Works_in(models.Model):
    emp_name = models.ForeignKey(User, related_name='works_emp_name', to_field='username', on_delete=models.CASCADE)
    dept_name = models.ForeignKey(Department, blank=False, null=False, to_field='name',related_name='works_on_dept', on_delete=models.CASCADE)

    class Meta:
        unique_together = ["emp_name", "dept_name"]

    def __str__(self):
        return str(self.emp_name) + " " + str(self.dept_name)


    def clean(self):
        emp_list = list(Works_in.objects.filter(dept_name=str(self.dept_name)).values_list('emp_name'))
        count = Emp_position.objects.filter(emp_uname__in=emp_list, position_name="Manager")
        is_manager = Emp_position.objects.filter(emp_uname = self.emp_name, position_name='Manager')
        # first the employee position should be added and then only department
        if(len(Emp_position.objects.filter(emp_uname = self.emp_name)) == 0):
            raise ValidationError(f"{self.emp_name}'s Position hasn't been added yet")
        if len(count)>=1 and len(is_manager)>=1:
            raise ValidationError('Manager already assigned to this department')
...