Итак, у меня есть эта модель, где я храню информацию, которую отправляет моя сущность.
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')