Пустой динамический вложенный сериализатор для общей модели 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

Работает ли код, приведенный выше, для вашей цели?

Вернуться на верх