Django - Автоматическое обновление значения одного поля после изменения значения
Я новичок в django и у меня есть простой вопрос. У меня есть две модели: Модель RegisterLogin и Модель OtpEmailVerify. Я хочу сделать поле 'is_verified' модели OtpEmailVerify 'True' при условии, что 'otp_no' совпадает с полем 'otp' модели LoginRegister.
models.py
class RegisterLogin(AbstractUser):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_date = models.DateTimeField(auto_now_add=True)
updated_date = models.DateTimeField(auto_now_add=True)
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=100, blank=False)
last_name = models.CharField(max_length=100, blank=False)
phone_regex = RegexValidator(regex=r'\+?1?\d{9,15}$',
message="Phone number must be entered in the format: '+999-999999'. Up to 15 digits allowed.")
phone_number = models.CharField(validators=[phone_regex], max_length=15, blank=False, unique=True)
sign_up_for_newspaper = models.BooleanField(default=False)
allow_remote_shopping_assistance = models.BooleanField(default=False)
otp = models.CharField(null=False, unique=False, max_length=5)
username = None
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'phone_number']
def __str__(self):
return self.email
def save(self, *args, **kwargs):
otp_choice = '1234567890'
for i in range(5):
self.otp += str(random.choice(otp_choice))
super(RegisterLogin, self).save()
class OtpEmailVerify(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
otp_no = models.IntegerField(default=0, help_text='Please enter the Otp that has been sent for '
'verification ')
user = models.OneToOneField(RegisterLogin, null=False, on_delete=models.CASCADE)
is_verified = models.BooleanField(default=False,
help_text='if it is true, that means can now validate otp for verification')
def __str__(self):
return self.otp_no
def save(self, *args, **kwargs):
if self.otp_no == self.user.otp:
return not self.is_verified
else:
return ValidationError('Wrong Otp Provided.')
views.py
class OtpVerifyView(generics.CreateAPIView):
queryset = OtpEmailVerify.objects.all()
serializer_class = OtpEmailVerifySerializer
serializer.py
class OtpEmailVerifySerializer(serializers.ModelSerializer):
class Meta:
model = OtpEmailVerify
fields = '__all__'
extra_kwargs = {
'id': {'read_only': True},
'is_verified': {'read_only': True},
}
Вам, вероятно, нужен этот код. django save and clean method
def save(self, *args, **kwargs):
if self.otp_no == self.user.otp:
self.is_verified = True
super(OtpEmailVerify, self).save(*args, **kwargs)
def clean(self):
if self.otp_no != self.user.otp:
raise ValidationError(
{
'error': 'Otp provided does not matched.'
}
)