【问题标题】:Django Rest - Include serializer object in get_*** methodDjango Rest - 在 get_*** 方法中包含序列化程序对象
【发布时间】:2015-06-29 20:00:21
【问题描述】:

我正在尝试将相关模型的序列化对象包含在另一个序列化程序的自定义对象中,但我不知道该怎么做。

我有两个模型 - sn-p 和 user。片段模型具有用户的外键。我需要的是在 UserSerializer 的“get_included”方法中包含 sn-p 的序列化对象,并使 UserSerializer 返回一个 JSON 对象,如下所示:

{
   "id" : 1,
   "included": [
      {'id': 2,'created': "20150729" },
      {'id': 3,'created': "20150730" }, 
   ]
}

以下是我的代码。

# Snippet Model
from django.db import models
class Snippet(models.Model):
   created = models.DateTimeField(auto_now_add=True)
   user = models.ForeignKey('auth.User', related_name='snippets')

# Snippet serializer
class SnippetSerializer(serializers.ModelSerializer):
   model = Snippet
   fields = ('id','created')

# User serializer
from .serializers import SnippetSerializer
class UserSerializer(serializers.ModelSerializer):
  included = serializers.SerilizerMethodField()
  class Meta: 
     model = User
     depth = 1 
     fields = ('id','included')

  def get_included(self, obj):
     snippets = SnippetSerializer(many=True, read_only=True).data

     return snippets

【问题讨论】:

    标签: python django serialization django-models django-rest-framework


    【解决方案1】:

    不需要get_included 方法。只需将snippets 属性添加到类。

    class UserSerializer(serializers.ModelSerializer):
        included = SnippetSerializer(many=True, read_only=True)
    
        class Meta: 
            model = User
            depth = 1 
            fields = ('id','included')
    

    【讨论】:

    • 我遵循 JSON API 结构 (jsonapi.org),我需要能够在“include”属性下包含相关模型的序列化对象。对不起。我没有清楚地解释我的要求。
    • 您可以随意命名该属性,只需将 SnippetSerializer 分配给它。
    • 有没有办法包含其他模型的多个序列化对象?比如 {"id":1, "included":[{"id":2,"created":"2015","type":"sn-p"}, {"id"2", created":" 2015","type":"comment"}]}
    • 为此,我认为您必须合并视图中的查询集并创建一个多态序列化程序来处理多种类型。
    猜你喜欢
    • 2020-03-05
    • 2016-10-22
    • 2015-07-20
    • 2021-04-09
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多