Если у меня есть 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 (я не использую правильный набор запросов) или проблемы с питоном(я не предоставляю сериализуемый метод / класс для объекта / класса)?