ModelSerializer POST应该是平的,而GET的深度应该是2

时间:2015-02-05 22:50:03

标签: python django model django-rest-framework

所以,我有这个模型:

class Article(models.Model):
   user = models.ForeignKey('User', null=True) # Allow anonymous articles
   url = models.CharField(max_length=255)
   date = models.DateTimeField()
   status = models.CharField(max_length=255)

这个序列化器:

class ArticleSerializer(serializers.modelSerializer):
    class Meta:
        model = Article
        fields = ('user', 'date', 'status')
        depth = 2

使用此视图集:

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all(=
    serializer_class = ArticleSerializer

因此,我在一个请求中获得与用户相关的所有内容。 问题是,如果我想添加一篇文章,我现在必须添加一大堆嵌套的json。我只想通过id引用用户并完成它。

像:

{
    "user": 1, // Or even null
    "url": "http://test.tld",
    "date": now,
    "status": "published"
}

我是如何实现这一目标的?我想我只需要另一个串行器来编写数据?如何将所有这些绑定在一起?

如果我想像这样POST JSON,我会收到错误说" Non-Field-Errors"因为"客户"还有一些关系,因为"深度"他们也需要被填补。但我想提供一个客户ID并完成它。

1 个答案:

答案 0 :(得分:1)

您可以在DRF中使用属性,它应该执行您要执行的操作

class Article(models.Model):
   _user = models.ForeignKey('User', null=True, db_column="user_id") # Allow anonymous articles
   url = models.CharField(max_length=255)
   date = models.DateTimeField()
   status = models.CharField(max_length=255)

@property
def user(self):
    return self._user
@user.setter
def user(self,value):
    self._user = User.objects.get(id=value)

然后在序列化器上

class ArticleSerializer(serializers.modelSerializer):
    user = serializers.Field(source='user')

class Meta:
    model = Article
    fields = ('user', 'date', 'status')
    depth = 2

在您阅读JSON时将返回用户对象,您可以修改@property以获得所需内容