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
Вернуться на верх