web-dev-qa-db-ja.com

django-rest-frameworkモデルシリアライザーフィールドを必須にする方法

私は段階的に記入しているモデルを持っています、それは私がフォームウィザードを作っていることを意味します。

そのため、このモデルのほとんどのフィールドは必須ですが、null=True, blank=Trueデータの一部を送信するときにnull以外のエラーが発生しないようにします。

私はAngular.jsとDjango-rest-frameworkを使用しています。必要なのは、xフィールドとyフィールドが必要であり、空の場合は検証エラーを返す必要があることをAPIに通知することです。

14
Cristian Rojas

特にフィールドをオーバーライドして、独自のバリデーターを追加する必要があります。詳細については、こちらをご覧ください 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
9
Edwin Lunando

ドキュメントによると、最良のオプション ここ はクラスMetaでextra_kwargsを使用することです。たとえば、電話番号を格納するUserProfileモデルがあり、必須です。

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('phone_number',)
        extra_kwargs = {'phone_number': {'required': True}} 
39
Sandeep Patil

これは、複数のフィールドに対する私の方法です。これは、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')
            )
        ]
6
Anton

別のオプションは、CharFieldを使用している場合はrequiredtrim_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

1
ipeluffo