2015-10-07 19 views
6

To moja Model:DjangoRestFramework - pomiń pola zerowe kiedy szeregowania obiektów

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post = models.CharField(max_length=400) 
    country = models.ForeignKey(Country, blank=True, null=True) 

a to mój serializer:

class PostSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',) 

    def create(self, validated_data): 
     post = Post(
       user = User.objects.get(username='MyUser'), 
       post = validated_data['post'], 
     ) 

     if validated_data.get('country', None): 
      post.country = validated_data['country'] 

     return post 

Czy jest jakiś sposób dla mnie powiedzieć DRF że jeżeli wartość pole ma wartość zerową (ponieważ pole "kraju" jest opcjonalne, a czasami nie jest dostępne), a następnie pomijane i tylko serializowane są inne dane? Lub przynajmniej serializować go z wartością None?

Nie sądzę, żebym mógł użyć SerializerMethodField (http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield), ponieważ pole "country" nie jest polem tylko do odczytu (ja też to piszę, jeśli jest ono dostarczone).

Zasadniczo chcę pominąć pole (lub przynajmniej wprowadzić wartość None) podczas serializacji obiektu Jeśli pole ma wartość NULL.

Odpowiedz

3

Od DRF 3.2.4, tak długo, jak dodać

blank=True 

pola modeli tak:

class Post(models.Model): 
    country = models.ForeignKey(Country, blank=True) 

następnie DRF będą traktować pole jako opcja podczas szeregowania i deserializacji go (Zauważ jednak, że jeśli nie ma wartość null = True na obszarze modelu, a następnie Django zgłosi błąd, jeśli spróbujesz s ave obiekt do bazy danych bez dostarczania pola).

Zobacz odpowiedź tutaj, aby uzyskać więcej informacji: DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?

Jeśli używasz wstępnie DRF 3.2.4, można zmienić pole w serializatora i dodać wymagane = False do niego. Zobacz dokumentację tutaj, aby uzyskać więcej informacji na temat określania lub przesłanianie pól jawnie: http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

Więc coś takiego (Zauważ, że nie w pełni przetestować poniższy kod, ale powinno to być coś wzdłuż tych linii):

class PostSerializer(serializers.ModelSerializer): 
    country = serializers.PrimaryKeyRelatedField(required=False) 
    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',)