gpt4 book ai didi

python - Django.rest_framework : How to serialize one to many to many?

转载 作者:太空狗 更新时间:2023-10-29 18:22:09 25 4
gpt4 key购买 nike

我在使用 Django 进行序列化时遇到了一些麻烦。我有三个模型,比方说学校、房间和书 table (例如虚拟名称)。每个学校有多个Room,每个Room有多个Desk。

类及其关系如下所示:

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

class Room(models.Model):
name = models.CharField()
school_id = models.ForeignKey(School)

class Desk(models.Model):
row = models.IntegerField()
col = models.IntegerField()
room_id = models.ForeignKey(Room)

我希望能够序列化一个学校列表,每个学校直接包含里面的所有课 table 。

我得到的壁橱是通过在我的 serialize.py 中编写三个序列化程序:

class DeskSerializer(serializers.ModelSerializer):
class Meta:
field = (row, col,)

class RoomSerializer(serializers.ModelSerializer):

desks = DeskSerializer(source='desk_set', many=True)
class Meta:
field = (desks,)

class SchoolSerializer(serializers.ModelSerializer):

rooms = RoomSerializer(source='room_set', many=True)
class Meta:
field = (name, rooms,)

当我想要一个包含课 table 列表的学校列表时,它会返回一个学校列表,其中包含一个房间列表,其中包含一个课 table 列表

我应该在 School 序列化程序中使用哪个源直接返回课 table ?像 source='room_set.desk_set' 这样的东西?或者可能通过使用 transform_ 函数?

PS:帖子里的代码是从头写的,可能的语法错误请忽略

最佳答案

如果我没理解错的话,您希望 SchoolSerializer 返回 2 层深的嵌套结构,但跳过中间模型。为此,我将在您的 School 模型中创建一个方法来检索 Desk 实例:

class School(models.Model):
...

def get_desks(self):
rooms = Room.objects.filter(school=self)
desks = Desk.objects.filter(room__in=rooms)
return desks

然后,在您的 SchoolSerializer 中包含一个字段,该字段使用该方法并根据您的需要通过 DeskSerializer 呈现返回的实例:

class SchoolSerializer(serializers.ModelSerializer):
...
desks = DeskSerializer(
source='get_desks',
read_only=True
)

class Meta:
field = (name, desks)

理解其工作原理的关键是用作 source 参数值的模型方法必须简单地返回该序列化程序模型的实例。序列化程序从那里获取它,渲染对象,但是您在该序列化程序中定义它们(在本例中为 DeskSerializer)。

希望这对您有所帮助。

关于python - Django.rest_framework : How to serialize one to many to many?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24760455/

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