use*_*875 7 python django serialization django-rest-framework
这是我的模特:
class Post(models.Model):
user = models.ForeignKey(User)
post = models.CharField(max_length=400)
country = models.ForeignKey(Country, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
这是我的序列化器:
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
Run Code Online (Sandbox Code Playgroud)
有没有办法让我告诉DRF,如果该字段的值为null(因为'country'字段是可选的,有时不提供),那么跳过它并只序列化其他数据?或者至少将其序列化为None值?
我不认为我可以使用SerializerMethodField(http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield)因为'country'字段不是只读字段(我也写过)它也是,如果提供的话).
我基本上想要在序列化对象时省略该字段(或至少使值为None)如果该字段为null.
从 DRF 3.2.4 开始,只要您添加
blank=True
Run Code Online (Sandbox Code Playgroud)
到模型字段,如下所示:
class Post(models.Model):
country = models.ForeignKey(Country, blank=True)
Run Code Online (Sandbox Code Playgroud)
然后 DRF 将在序列化和反序列化时将该字段视为可选字段(请注意,如果模型字段上没有 null=True,那么如果您尝试将对象保存到数据库而不提供该字段,Django 将引发错误) .
有关更多信息,请参阅此处的答案:DjangoRestFramework - 将“required = false”添加到 ModelSerializer 字段的正确方法?
如果您使用的是 DRF 3.2.4 之前的版本,那么您可以覆盖序列化程序中的字段并向其添加 required=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',)
Run Code Online (Sandbox Code Playgroud)
这个线程可能有用:
它基本上是说您可以通过稍加修改来覆盖 to_representation() 函数。
我会把它放在评论中,但我还没有足够的分数:(
| 归档时间: |
|
| 查看次数: |
8130 次 |
| 最近记录: |