2015-10-07 122 views
6

时,这是我的模型忽略空字段:DjangoRestFramework序列化对象

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

,这是我的串行:

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 

有什么办法,我告诉DRF,如果价值该字段为空(因为“国家”字段是可选的,有时不提供),然后跳过它,只是序列化的其他数据?或者至少序列化它的值为None?

我不认为我可以使用SerializerMethodField(http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield),因为'country'字段不是只读字段(如果提供它,我也会写它)。

我基本上要序列化的对象时如果该字段为空省略字段(或至少使值无)。

回答

3

由于DRF 3.2.4的,只要你加

blank=True 

的车型领域像这样:

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

然后DRF将把场序列化和反序列化它(但请注意,如果没有空=型号场真当是可选的,那么Django会,如果你试着去养一个误差ε在没有提供字段的情况下向数据库提供对象)。

一看便知这里了解更多信息:DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?

如果您正在使用预DRF 3.2.4,那么你就可以覆盖领域的串行和添加必需= False来了。看到这里的文档的详细信息,指定或可明确覆盖领域:http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

因此,像这样(请注意,我没有完全测试下面的代码,但它应该是沿着这些路线的东西):

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