2015-10-07 120 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',)