2015-06-20 5 views
7

Mam model, który wypełniam krok po kroku, oznacza to, że tworzę kreatora formularzy.django-rest-framework, jak utworzyć wymagane typy serializatora modelu

Z tego powodu większość pól w tym modelu jest wymagana, ale ma wartość null=True, blank=True, aby uniknąć zgłaszania niepoprawnych błędów podczas przesyłania części danych.

Pracuję z Angular.js i django-rest-framework, a potrzebuję powiedzieć api, że pola x i y powinny być wymagane i muszą zwrócić błąd sprawdzania poprawności, jeśli są puste.

Odpowiedz

5

Musisz w szczególności zastąpić pole i dodać własny weryfikator. Możesz przeczytać tutaj po więcej szczegółów http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly. To jest przykładowy kod.

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 
4

To jest mój sposób na wiele pól. Oparty na przepisywaniu 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) 
     )) 

Zastosowanie:

class MyUserRegistrationSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ('email', 'first_name', 'password') 
     validators = [ 
      RequiredValidator(
       fields=('email', 'first_name', 'password') 
      ) 
     ] 
9

Najlepszym rozwiązaniem według docs here jest użycie extra_kwargs w klasie Meta, na przykład masz UserProfile model, który przechowuje numer telefonu i jest wymagany

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