gpt4 book ai didi

python - Django - 如何序列化继承

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:55 25 4
gpt4 key购买 nike

我浏览了https://django-model-utils.readthedocs.io/en/latest/managers.html处的文档了解有关 InheritanceManager 的更多信息。我不会添加 models.py 因为它与文档中的相同。所以,这是我的views.py:

class PlaceList(generics.ListAPIView):

serializer_class = PlaceSerializer

def get_queryset(self):
return Place.objects.select_subclasses()

如您所见,return Place.objects.select_subclasses() 行返回数据库中存储的所有 Bar、Restaurant 或 Place 实例。

我的 serializers.py 如下所示:

from rest_framework import serializers
from genericRelations.models import Place, Restaurant, Bar

class PlaceSerializer(serializers.ModelSerializer):
class Meta:
model = Restaurant
fields = ('id', 'location')

class RestaurantSerializer(serializers.ModelSerializer):
class Meta:
model = Restaurant
fields = ('id', 'location', 'restaurant_name')


class BarSerializer(serializers.ModelSerializer):
class Meta:
model = Bar
fields = ('id', 'location', 'bar_name')

我不知道如何修改 PlaceSerializer 以便它也序列化/反序列化 Place 的子类。例如。类似于“如果遇到 Bar 实例,则使用 BarSerializer”和“如果遇到 Restaurant 实例,则使用 RestaurantSerializer”。

注意:当 URL 为 .../places/ 时,将执行 PlaceList 并产生以下输出:

{
"places": [
{
"id": 1,
"location": "Köln"
},
{
"id": 2,
"location": "Köln"
},
{
"id": 3,
"location": "Köln"
},
{
"id": 4,
"location": "Köln"
},
{
"id": 5,
"location": "Köln"
}
]
}

但我想要的是如下所示的内容(餐厅和酒吧的混合):

{
"places": [
{
"id": 1,
"location": "Köln"
"bar_name": "BarName 1"
},
{
"id": 2,
"location": "Köln"
"restaurant_name": "RestaurantName 1"
},
{
"id": 3,
"location": "Köln"
"bar_name": "BarName 2"
},
{
"id": 4,
"location": "Köln"
"bar_name": "BarName 3"
},
{
"id": 5,
"location": "Köln"
"restaurant_name": "RestaurantName 2"

}
]
}

如何更改我的 serializers.py 文件,以便 Django 可以为正确的模型使用正确的序列化器?

最佳答案

我不知道有什么好的方法可以做到这一点,但是有一个包 https://pypi.org/project/django-rest-polymorphic/为 Django Rest Framework 提供多态序列化器。 AFAIK,DRF 不提供 ModelSerializer 中的多态性。

您可以使用序列化器并实现所有方法来根据数据检测并返回正确的字段,但这并不简单。

关于python - Django - 如何序列化继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56924349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com