【问题标题】:ModelSerializer POST should be flat, while GET should have depth of 2ModelSerializer POST 应该是平坦的,而 GET 应该有 2 的深度
【发布时间】:2015-04-05 23:48:12
【问题描述】:

所以,我有这个模型:

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,我会收到一条错误消息“非字段错误”,因为“客户”附加了一些关系,并且由于“深度”,它们也需要填充。但我只想提供一个客户 ID 并完成它。

【问题讨论】:

  • 您是否有没有显示的nested serializers
  • @RossRogers:不,我在整个应用程序的其余部分都使用 HyperlinkedModelSerializers,但问题是如果我想发布一篇文章,我会得到“非字段错误”,因为我必须指定整个客户及其所有子关系,这太深了^^

标签: python django model django-rest-framework


【解决方案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 以获得您需要的内容

【讨论】:

  • 基本上这将是一个有趣的解决方案,问题是用户现在说:“用户”=“用户对象”,而不是每当我获取文章时的实际数据。有没有办法解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2021-09-13
  • 2021-08-07
  • 2023-03-07
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
相关资源
最近更新 更多