2015-10-02 3 views
1

У меня есть BaseModel класс:Django rest framework - как сериализовать базовый сериализатор класса класса?

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

Тогда у меня есть mutliple классы модели, расширяющие такого класса, например:

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

Моя цель иметь поле в объекте JSON возвращается через мой webservices, чтобы указать тип объекта (чтобы клиентские приложения могли легко сообщать статью из продукта электронной коммерции). Что-то вроде следующего:

{ 
    "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 
+0

Посмотрите на декоратор '@ property'. – Ivan

ответ

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',) 
Смежные вопросы