django-rest-model serializer 필드를 필수화하는 방법
차근차근 작성 중인 모델이 있습니다. 폼마법사를 만들고 있습니다.
그렇기 때문에 이 모델의 대부분의 필드는 필수이지만null=True, blank=True
데이터 일부를 전송할 때 늘 오류가 발생하지 않도록 합니다.
저는 Angular.js와 django-rest-framework를 사용하고 있으며, 필요한 것은 API에 x와 y 필드가 필수이며, 필드가 비어 있으면 검증 오류를 반환해야 한다는 것입니다.
여기서 설명하는 docs에 따르면 가장 좋은 옵션은 클래스 Meta에서 extra_kwargs를 사용하는 것입니다.예를 들어 전화번호를 저장하고 필요한 UserProfile 모델이 있습니다.
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ('phone_number',)
extra_kwargs = {'phone_number': {'required': True}}
이렇게 하려면 모델이 다음과 같이 공백 false null false로 설정되어 있어야 합니다.
some_field = models.CharField(blank=False, null=False, default='Anonymous')
특히 필드를 재정의하고 자체 검증자를 추가해야 합니다.상세한 것에 대하여는, http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-rely 를 참조해 주세요.이것은 샘플 코드입니다.
def required(value):
if value is None:
raise serializers.ValidationError('This field is required')
class GameRecord(serializers.ModelSerializer):
score = IntegerField(validators=[required])
class Meta:
model = Game
이것은 여러 분야에 대한 나의 방법이다.UniqueTogetherValidator의 개서를 기반으로 합니다.
from django.utils.translation import ugettext_lazy as _
from rest_framework.exceptions import ValidationError
from rest_framework.utils.representation import smart_repr
from rest_framework.compat import unicode_to_repr
class RequiredValidator(object):
missing_message = _('This field is required')
def __init__(self, fields):
self.fields = fields
def enforce_required_fields(self, attrs):
missing = dict([
(field_name, self.missing_message)
for field_name in self.fields
if field_name not in attrs
])
if missing:
raise ValidationError(missing)
def __call__(self, attrs):
self.enforce_required_fields(attrs)
def __repr__(self):
return unicode_to_repr('<%s(fields=%s)>' % (
self.__class__.__name__,
smart_repr(self.fields)
))
사용방법:
class MyUserRegistrationSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ( 'email', 'first_name', 'password' )
validators = [
RequiredValidator(
fields=('email', 'first_name', 'password')
)
]
이것은 백엔드 앱에서 매우 잘 작동합니다.
class SignupSerializer(serializers.ModelSerializer):
""" Serializer User Signup """
class Meta:
model = User
fields = ['username', 'password', 'password', 'first_name', 'last_name', 'email']
extra_kwargs = {'first_name': {'required': True, 'allow_blank': False}}
extra_kwargs = {'last_name': {'required': True,'allow_blank': False}}
extra_kwargs = {'email': {'required': True,'allow_blank': False}}
또 다른 옵션은required
그리고.trim_whitespace
CharField를 사용하는 경우:
class CustomObjectSerializer(serializers.Serializer):
name = serializers.CharField(required=True, trim_whitespace=True)
required
문서: http://www.django-rest-framework.org/api-guide/fields/ #필수 trim_whitespace
문서: http://www.django-rest-framework.org/api-guide/fields/ #charfield
link1 및 link2에 따라 의도된 필드에 따라null=True, blank=True
(마치email
의 분야django.contrib.auth.models.User
이 예에서는, 다음과 같이 동작합니다.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'email', 'password')
extra_kwargs = {'email': {'required': True,
'allow_blank': False}}
언급URL : https://stackoverflow.com/questions/30953481/django-rest-framework-how-to-make-model-serializer-fields-required
'programing' 카테고리의 다른 글
인터페이스 FormData를 구현하지 않는 개체에서 'append'가 호출되었습니다. (0) | 2023.03.02 |
---|---|
Oracle 관리 드라이버는 비동기/대기 기능을 올바르게 사용할 수 있습니까? (0) | 2023.03.02 |
Angular의 다른 필드와 함께 FormData 전송JS (0) | 2023.03.02 |
Java 9에서 클래스 및 리소스 로드 (0) | 2023.03.02 |
Cordova + Angularjs + 디바이스 지원 (0) | 2023.03.02 |