【问题标题】:Django rest framework - how to serialise the model class name base serialiser?Django rest 框架 - 如何反序列化基于模型类名的序列化器?
【发布时间】:2015-12-30 08:45:33
【问题描述】:

我有一个 BaseModel 类:

class BaseModel(models.Model):
    title = models.CharField(max_length=250, blank=True, null=True)
    class Meta:
        abstract = True

然后我有多个扩展此类的模型类,例如:

class Article(BaseModel):
    slug = models.SlugField(max_length=250, default=timezone.now, unique=True)

我的目标是通过我的 Web 服务返回 JSON 对象中的一个字段来指示对象的类型(以便客户端应用程序可以轻松地从电子商务产品中区分文章)。类似于以下内容:

{
   "id": 1,
   "object_type: "article",
   "title": "some article",
   "slug": "some-article"
}

我想可能有一个类似于以下的 BaseModelSerializer 类:

class BaseModelSerializer(serializers.ModelSerializer):
    object_type = self.__class__.__name__ # ??? how to get the name/ label of the child class?

然后我可以有一个 ArticleSerializer 扩展 BaseModelSerializer,如下所示:

class ArticleSerializer(BaseModelSerializer):
    class Meta:
        model = Article

如果这也可以通过修改 BaseModel 类来实现,我会很高兴。像下面这样的东西?

class BaseModel(models.Model):
    title = models.CharField(max_length=250, blank=True, null=True)
    object_type = self.__class__.__name__ # ??? how to get the name/ label of the child class?
    class Meta:
        abstract = True

【问题讨论】:

  • @property装饰器。

标签: python json django inheritance django-rest-framework


【解决方案1】:

使用SerializerMethodField

class BaseModelSerializer(serializers.ModelSerializer):
    object_type = serializers.SerializerMethodField()

    def get_object_type(obj):
        return obj.__class__.__name__.lower()


class ArticleSerializer(BaseModelSerializer):
    class Meta:
        model = Article
        fields = ('object_type',)

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 2012-11-16
    • 1970-01-01
    • 2014-07-26
    • 2017-11-15
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多