Пустой динамический вложенный сериализатор для общей модели Django
У меня есть общая модель под названием Thumbs с двумя полями, которые могут описывать другую модель. Этими двумя полями являются:
- 'entity_type', поле CharField
- значениями могут быть
family
илиproduct
, оба соответствуют моделям Family и модели продукта, соответственно
- значениями могут быть
- Затем есть 'entity_id', поле IntegerField
- это первичный ключ для предыдущей сущности в другой таблице.
Итак, я хочу создать сериализатор для этой модели Thumbs, который реализует вложенный сериализатор для указанного 'entity_type'. Например, если 'entity_type' - это family
, то сериализатор использует FamilySerializer
, так что сериализованный объект Thumbs будет содержать данные сущности.
Вот как я реализовал это поведение, но оно возвращает пустой family
объект.
from rest_framework import serializers
from app.models import Thumbs, Family
from app.serializers.user_role_product_tool import FamilySerializer, ProductSerializer
class ThumbSerializer(serializers.ModelSerializer):
entity = serializers.SerializerMethodField()
class Meta:
model = Thumbs
fields = '__all__'
def get_entity(self, obj):
if obj.entity_type == "family":
return FamilySerializer(source=obj.entity_id, read_only=True).data
else:
return None
Пример вывода, показывающий, что сериализатор Family используется, как и ожидалось, но он пуст, хотя в таблице Family есть запись с PrimaryKey, равным 107:
{
"id": 182,
"entity": {
"family_name": "",
"status": "",
"created_by": "",
"last_updated_by": ""
},
"entity_id": "107",
"entity_type": "family",
"thumbs_decision": "PENDING",
"entity_parent_id": "181",
"created_date": "2024-09-03T14:21:17.403159-07:00",
"last_updated_by": "",
"last_updated_date": "2024-09-03T14:21:17.403217-07:00",
"created_by": "guest"
},
{
"id": 212,
"entity": null,
"entity_id": "951",
"entity_type": "product",
"thumbs_decision": "PENDING",
"entity_parent_id": "181",
"created_date": "2024-09-03T14:21:18.647675-07:00",
"last_updated_by": "",
"last_updated_date": "2024-09-03T14:21:18.647712-07:00",
"created_by": "guest"
},
С помощью сериализатора был получен и возвращен объект модели Family с тем же значением id, что и у obj.entity_id.
from rest_framework import serializers
from app.models import Thumbs, Family
from app.serializers.user_role_product_tool import FamilySerializer, ProductSerializer
class FamilySerializer(serializers.ModelSerializer):
class Meta:
model = Family
fields = '__all__'
class ThumbSerializer(serializers.ModelSerializer):
entity = serializers.SerializerMethodField()
class Meta:
model = Thumbs
fields = '__all__'
def get_entity(self, obj):
if obj.entity_type == "family":
family = Family.objects.get(id=obj.entity_id)
serializer = FamilySerializer(family)
return serializer.data
else:
return None
Работает ли код, приведенный выше, для вашей цели?