save 和 clean 方法如何在 django 模型 class 中工作以及如何调用它们?另外,超级在这段代码中有多大帮助?

how save and clean method works in django model class and how they are invoked? Also, how super is helping in this code?

from django.db import models
from django.core.exceptions import ValidationError
from rest_framework import serializers
import re
class UserModel(models.Model):
    name = models.CharField(max_length=50, blank=False, default='')
    email = models.CharField(max_length=50, blank=False, default='')
    #phone = models.IntegerField(blank=False, default='')
    phone = models.CharField(max_length=10,blank=True, default='')
    company = models.CharField(max_length=50, blank=True, default='')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('id',)

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

    **def clean(self):
        super(UserModel, self).clean()**
        errors = {}
        valphone = self.phone
        valmail = self.email
        regex = '^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9_-]+\.\w{2,3}$'
        if not (valphone.isdigit() and len(valphone) == 10):
            errors['phone'] = (f"{valphone} must`enter code here` be 10 digits and shouldn't contain any string")
        if not (re.search(regex, valmail)):
            errors['email'] = ('Invalid email id format')
        if errors:
            raise serializers.ValidationError(errors)

clean 默认情况下不会被 save 调用,这意味着您需要手动调用它。在您共享的代码中,自定义了 save 以确保每次调用 save 时都会调用 clean。调用 clean 之后,它会通过 super()

调用默认的 save 方法

您可以在这里阅读更多内容:https://docs.djangoproject.com/en/3.2/ref/models/instances/#django.db.models.Model.clean

Note, however, that like Model.full_clean(), a model’s clean() method is not invoked when you call your model’s save() method.