потерять поля подкласса при сериализации в django?

Я вижу сбивающее с толку и то, что кажется совершенно плохим поведением при сериализации объектов django. Например, у меня есть модели:

class MyTag(TagBase):
    user = models.ForeignKey(User)


class MyMpttTag(MPTTModel, MyTag):
    parent      = TreeForeignKey('self', null=True, blank=True, related_name='children')

    class MPTTMeta:
        parent_attr         = 'parent'

что означает, что MyMpptTag имеет поля name, slug, user, parent. Но когда я делаю serializers.serialize('json', MyMpptTag.object.all()), я получаю: [{"fields": {"lft": 1, "level": 0, "tree_id": 29, "parent": null, "rght": 2}, "model" : "index.mymptttag", "pk": 45}...]

Почему я должен потерять name, slug, and user и как мне их вернуть? Спасибо


person codyc4321    schedule 16.08.2015    source источник
comment
Если MyTag не является абстрактным классом, сериализация приведет как минимум к 2 типам объектов (с одним и тем же первичным ключом). Один из них будет из модели MyMpttTag, а другой из модели MyTag (их может быть больше, если TagBase и его родители также не являются абстрактными).   -  person GwynBleidD    schedule 17.08.2015
comment
это имеет больше смысла, поэтому нормальное поведение — это хорошо, но если вы намеревались использовать класс только как подкласс, я должен поставить abstract=True. вызовет ли это какие-либо серьезные проблемы при миграции после того, как я сделаю реферат?   -  person codyc4321    schedule 17.08.2015
comment
TagBase — это абстракция внутри django-taggit.   -  person codyc4321    schedule 17.08.2015
comment
да, был плохой дизайн, когда я не объявлял абстракцию. Я не могу принять ваш ответ, так как он находится в комментарии   -  person codyc4321    schedule 17.08.2015


Ответы (1)


В этом дизайне модели у вас будет 2 таблицы в базе данных:

  • yourapp_mytag, который будет иметь столбец первичного ключа (обычный столбец с автоинкрементом), все столбцы, унаследованные от TagBase (пока TagBase является абстрактным), и столбец user - внешний ключ для модели User
  • yourapp_mymptttag tht будет иметь столбец первичного ключа, который также является внешним ключом для MyTag модели и столбцов для mptt. Не будет столбцов, унаследованных от MyTag.

Это означает: в модели MyMpttTag нет столбцов, унаследованных от MyTag, есть только ссылки на фактические столбцы в MyTag.

В сериализации будет 2 типа объектов: MyMpttTag и MyTag.

person GwynBleidD    schedule 17.08.2015
comment
миграции были неприятными, но создание подкласса MyTag как абстрактного решило это. - person codyc4321; 18.08.2015