DRF - 如何将两个不同的模型连接成一个 .json api?

DRF - how to concatenate two different models in one .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

from drf_multiple_model.views import FlatMultipleModelAPIView

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

这是另一个视图,我可以在其中从 GET/POST/DELETE/PUT 请求中检索数据,您可以将其用于过滤

class Dog_cat_view_api(ObjectMultipleModelAPIView):
    def get_querylist(self):

        #this is a user(header Authorization:token 123123)
        user = self.request.user 
        #this is data (in body(form-data))
        data = self.request.data

        querylist = [
            {'queryset': Dog.objects.all(), 'serializer_class': Dof_Serializer},
            {'queryset': Cat.objects.all(), 'serializer_class': Cat_Serializer},
        ]
        return querylist

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"),