2015-02-05 37 views
0

那么深,我有这样的模式:ModelSerializer POST应该是平的,而GET应该有2

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" 
} 

任何想法我怎么能做到这一点?我想我需要另一个序列化器来写数据?如何将所有这些绑定在一起?

如果我想这样发布JSON,我会收到一个错误,指出“非字段错误”,因为“customer”有几个附加关系,并且由于“深度”,它们也需要填充。但我只想提供一个客户ID并完成它。

+0

你有[nested serializers](http://www.django-rest-framework.org/api-guide/serializers/#specifying-nested-serialization )你不是在炫耀G? – 2015-02-06 00:09:40

+0

@RossRogers:不,我在整个应用程序的其余部分使用HyperlinkedModelSerializers,但问题是,如果我想发布文章,我会得到“非字段错误”,因为我必须指定整个客户以及它的所有子 - 关系,这太深了^^ – Sorona 2015-02-06 11:24:55

回答

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得到你需要的东西

+0

基本上这将是一个有趣的解决方案,问题是,用户现在说:“用户”=“用户对象”,而不是实际的数据,只要我获得文章。有没有办法解决? – Sorona 2015-02-06 16:29:03