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.
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.