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"),
我的任务是在一个 .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"),