Объект типа <Model>не поддерживает сериализацию в формате JSON - PullRequest
0 голосов
/ 19 сентября 2018

Если у меня есть GFK-подобные модели наследования Assets (Asset.model, имеющие asset_id, asset_name и Account, OneType.model, SecondType.model, все они наследуются от модели Asset и т. Д. ...основанный на this ), и я хочу предоставить конечную точку API для всех активов в моем Account, я мог бы иметь (не уверен, если это соглашение) свойство в модели Account, которая являетсясписок, который расширяет различные типы активов:

#Account model
@property
def assets(self):
    assets = []
    assets.extend(self.onetype_set.all())
    assets.extend(self.secondtype_set.all())
    …
    return assets

Мне понадобится сериализатор для учетной записи

class AccountSerializer(serializers.ModelSerializer):

    # filter to assets for the user
    def get_queryset(self):
        return Account.objects.filter(organization=self.request.user)

    class Meta:
        model = Account
        fields = ('assets', )

, и я предполагаю, что для каждого из типов активов

class OneTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = OneType
        fields = ('asset_id', 'asset_name',)
class SecondTypeSerializer(serializers.ModelSerializer):
    …
…

но я получаю сообщение об ошибке: Object of type 'OneType' is not JSON serializable (я понимаю, что ошибка означает, что мне нужно сериализовать модель в JSON, но я думал, что модель вызовет сериализатор модели….)

трассировка стека не кажется полезной из-за внутренней работы наборов представлений DRF, но вот она:

/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py in default
            else:
                return list(iterable)
            # Let the base class default method raise the TypeError
            return JSONEncoder.default(self, o)
    """
    raise TypeError("Object of type '%s' is not JSON serializable" %
                    o.__class__.__name__) ...
def encode(self, o):
    """Return a JSON string representation of a Python data structure.
    >>> from json.encoder import JSONEncoder
    >>> JSONEncoder().encode({"foo": ["bar", "baz"]})

▼ Local vars
Variable    Value
o           <OneType: AssetName - Type 1 : Account 2>
self        <rest_framework.utils.encoders.JSONEncoder object at 0x11dce1668>

Viewsets.py:

class AssetViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`, `update` and `destroy` actions.
    """
    serializer_class = AssetSerializer
    permission_classes = (permissions.IsAuthenticated, IsOrganizationMember,)

    def get_queryset(self):
        slug = self.kwargs['slug']
        return Account.objects.filter(slug=slug)

Кроме того, это большепроблемы DRF (я не использую правильный набор запросов) или проблемы с питоном(я не предоставляю сериализуемый метод / класс для объекта / класса)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...