- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用 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/
我是一名优秀的程序员,十分优秀!