DRF - как объединить две разные модели в одном .json api?

У меня есть задача вывода в разные модели в одном .json файле

Так что мне нужно, чтобы в конце две разные модели выглядели так на одной api странице: http://127.0.0.1:8000/cat_dog_api/

Мой целевой результат:

[
    {
        "dog_big": "Mastiff",
        "dog_small": "Terrier",
        "same_line": "different words 1",

    },
    {
        "cat_big": "Singapura",
        "cat_small": "Maine Coon",
        "same_line": "different words 2",
    }
]

Примерные модели:

class Cat(models.Model):
    cat_big = models.CharField(max_length=300)
    cat_small = models.CharField(max_length=300)
    same_line = models.CharField(max_length=300)


class Dog(models.Model):
    dog_big = models.CharField(max_length=300)
    dog_small = models.CharField(max_length=300)
    same_line = models.CharField(max_length=300)

Я нашел, как объединить модели с "цепочкой" в один кверисет

Views.py:

from itertools import chain

class Whole_test(generics.ListAPIView):
    serializer_class = Cat_dog_Serializer

    def get_queryset(self):
        return list(chain(Cat.objects.all(), Dog.objects.all()))

Но я застрял, когда дело дошло до сериализатора, Я должен выбрать одну модель с сериализатором,

class Cat_dog_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Cat
        fields = '__all__'

но в этом случае он не определяет мою модель Dog из моего набора запросов

Есть ли способ достичь моей цели, возможно, отличный от моего подход?

Вам нужны вложенные сериализаторы внутри Cat_dog_Serializer.

class CatSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cat
        fields = '__all__'

class DogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Dog
        fields = '__all__'

class Cat_dog_Serializer(serializers.Serializer):
    cat = CatSerializer()
    dog = DogSerializer()

    class Meta:
        fields = ["cat", "dog",]

Подробнее вы можете прочитать здесь: https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

Я нашел решение:

pip install django-rest-multiple-models

settings.py

INSTALLED_APPS = (
    ....
    'drf_multiple_model',
)

Views.py

class Dog_cat_view_api(FlatMultipleModelAPIView):
    pagination_class = None
    querylist = [
        {'queryset': Dog.objects.all(), 'serializer_class': Dof_Serializer},
        {'queryset': Cat.objects.all(), 'serializer_class': Cat_Serializer},
    ]

Serializer.py

class Dog_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Dog
        fields = '__all__'

class Cat_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Cat
        fields = '__all__'

urls.py

path('cat_dog_api/', views.Dog_cat_view_api.as_view(), name="cat_dog_api"),
Вернуться на верх