При использовании типов Generics и ModelSerializer, как я могу сериализовать унаследованный класс вместо базового класса в Django Rest Framework?

Контекст:

models.py

Допустим, у меня есть класс Generic Django Model, называемый "Base" для группировки всех других классов, которые расширяют его:

class Base(models.Model):
    name = models.CharField(...)

    belongs_to = models.ForeignKey(
        'self', on_delete=models.PROTECT, blank=True, null=True
    )

И класс "Компания", который расширяет "База":

class Company(Base)
    pass  # It just extends the Base Attributes.

Класс "Manager", также расширяет "Base", но имеет атрибут роли :

class Manager(Base)
    role = models.ForeignKey(Roles, on_delete=models.CASCADE ...)

И класс "Worker", который также расширяет "Base", но имеет атрибут job:

class Worker(Base):
    job = models.ForeignKey(Jobs, on_delete=models.CASCADE ...)

Выполнение

Вот пример того, как они могут быть инстанцированы:

Company.objects.create(name='Company1', 
                       belongs_to=None) # This will also create a Base Object with the ID 1.


Manager.objects.create(name='Manager1', 
                       belongs_to=1 [[company]], 
                       role=1)  # This will create a Manager object and relate it to the Company. 
# (And also create a Company object with the ID 2, that don't make much sense, but is only an abstract example)

Worker.objects.create(name='Worker1', 
                      belongs_to=2 [[manager]], job=1) # In this case, I'm saying that the Worker is grouped under the Manager Object.

Идея заключается в том, что Работник может также не иметь руководителя и быть непосредственно связанным с Компанией, например:

(...)

Worker.objects.create(name='Worker34', 
                      belongs_to=1 [[company]], 
                      job=1) # In this case, I'm saying that the "Worker" is grouped under the "Company" Object.

Django Rest and Question Wrap-up:

Теперь к DJANGO REST на мой вопрос:

Я использую serializer.ModelSerializer (поскольку у меня нет большого опыта в архитектуре программного обеспечения, и я пытаюсь сохранить его как можно более простым и эффективным) с 'Meta' depth, чтобы иметь вложенные объекты :

serializer.py

class WorkerSerializer(serializers.ModelSerializer):

    class Meta:
        model = Worker
        fields = '__all__'
        depth = 3

Но поскольку поле belongs_to является атрибутом Base , оно возвращает только информацию, содержащуюся в Base, вот так:

    {
        "id": 3,
        "name": "Worker1,
        "belongs_to": {
            "id": 2,
            "nome": "Manager1",
            ****this is where I would like to have the aditional Manager Object info."
            "belongs_to": {
                "id": 1,
                "nome": "Company1",
            }
        },
    },

В этом примере мне понадобится атрибут Manager 'roles' из таблицы Roles Table (опущен в этом примере), чтобы также получить информацию оттуда.

Есть ли способ указать сериализатору, что он должен сначала попытаться проверить, указывает ли 'belongs' на объект более высокой цепочки или, поскольку это атрибут базы, он вернет только сериализованные атрибуты базы

Возможно ли это, жизнеспособно ли это и как мне это сделать?

Вы можете расширить ссылку на поле в сериализаторах с помощью других сериализаторов. Например:

class ManagerSerializer(serializers.ModelSerializer):

    class Meta:
        model = Manager
        fields = '__all__'

class WorkerSerializer(serializers.ModelSerializer):
    belongs_to = ManagerSerializer()

    class Meta:
        model = Worker
        fields = '__all__'

Таким образом можно вернуть более подробную информацию о поле в отношении ForeingKey

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