Django модель TextField отображение формата почтового индекса
В моем models.py
поле почтового индекса имеет формат TextField
:
class Merged(models.Model):
zip_code = models.TextField(db_column='Zip Code', blank=True, null=True)
Однако есть некоторые недействительные почтовые индексы, например
sagaponack 11962
lindenhurst 11757
Я просто хочу отобразить 5-значный почтовый индекс без каких-либо других текстов.
Что я пробовал и не получилось
В serializers.py
я попытался применить RegexField
к zip_code
столбцу:
class MergedSerializer(serializers.HyperlinkedModelSerializer):
zip_code = serializers.RegexField(regex=r'^\d{5}')
class Meta:
model = Merged
fields = '__all__'
Это не сработало.
Как мне решить эту проблему таким образом, чтобы не только изменить способ отображения, но и обеспечить правильную сортировку (т.е. игнорировать текстовую часть, сортировать только по почтовым индексам)
Model.clean() - это метод класса Model, который может обеспечить пользовательскую валидацию для вашей модели. Вы можете увидеть все методы и свойства класса Model по этой ссылке [https://docs.djangoproject.com/en/3.2/ref/models/instances/][1]
class Article(models.Model):
def clean(self):
/*** your validations **/
если вы хотите отделить валидацию для моделей, вы можете сделать это через класс ModelForm, который намного лучше класса Model
class UserFields(forms.ModelForm):
def clean_contact_number(self):
contact_number = self.cleaned_data.get('contact_number')
if ' ' in contact_number:
raise forms.ValidationError('Should not have blank spaces included')
if not str(contact_number).isdigit():
raise forms.ValidationError('Should not have letters or special characters included')
pass
return contact_number
pass
В Django есть множество способов сделать пользовательскую валидацию, даже класс serializers имеет собственный метод для валидации
class BoxSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Box
fields = ('id', 'name', 'url', 'title')
def validate(self, data):
if self.instance: # 'instance' will be set in case of `PUT` request i.e update
object_id = self.instance.id # get the 'id' for the instance
# write your validation logic based on the object id here
return data
def validate_title(self, value):
"""
Check that the blog post is about Django.
"""
if 'django' not in value.lower():
raise serializers.ValidationError("Blog post is not about Django")
return value