私は段階的に記入しているモデルを持っています、それは私がフォームウィザードを作っていることを意味します。
そのため、このモデルのほとんどのフィールドは必須ですが、null=True, blank=True
データの一部を送信するときにnull以外のエラーが発生しないようにします。
私はAngular.jsとDjango-rest-frameworkを使用しています。必要なのは、xフィールドとyフィールドが必要であり、空の場合は検証エラーを返す必要があることをAPIに通知することです。
特にフィールドをオーバーライドして、独自のバリデーターを追加する必要があります。詳細については、こちらをご覧ください http://www.Django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly 。これはサンプルコードです。
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
ドキュメントによると、最良のオプション ここ はクラスMetaでextra_kwargsを使用することです。たとえば、電話番号を格納するUserProfileモデルがあり、必須です。
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ('phone_number',)
extra_kwargs = {'phone_number': {'required': True}}
これは、複数のフィールドに対する私の方法です。これは、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')
)
]
別のオプションは、CharFieldを使用している場合はrequired
とtrim_whitespace
を使用することです。
class CustomObjectSerializer(serializers.Serializer):
name = serializers.CharField(required=True, trim_whitespace=True)
required
doc: http://www.Django-rest-framework.org/api-guide/fields/#requiredtrim_whitespace
doc: http: //www.Django-rest-framework.org/api-guide/fields/#charfield