Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django.rest_框架:如何序列化一对多对多?_Python_Django_Serialization_Django Queryset_Django Rest Framework - Fatal编程技术网

Python Django.rest_框架:如何序列化一对多对多?

Python Django.rest_框架:如何序列化一对多对多?,python,django,serialization,django-queryset,django-rest-framework,Python,Django,Serialization,Django Queryset,Django Rest Framework,我在用django连载时遇到了一些麻烦。 我有三个模型,比如说一所学校、一个房间和一张桌子(比如虚名)。 每个学校都有多个房间,每个房间都有多张桌子 类及其关系如下所示: class School(models.Model): name = models.CharField() class Room(models.Model): name = models.CharField() school_id = models.ForeignKey(School) class

我在用django连载时遇到了一些麻烦。 我有三个模型,比如说一所学校、一个房间和一张桌子(比如虚名)。 每个学校都有多个房间,每个房间都有多张桌子

类及其关系如下所示:

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)
我希望能够序列化一个学校列表,每个都直接包含里面的所有课桌

我得到的壁橱是通过在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,)
当我想要一张包含书桌列表的学校列表时,它会返回一张包含书桌列表的学校列表

我应该在学校序列化程序中使用哪个源直接返回桌面?类似于source='room\u set.desk\u set'?或者使用变换函数


PS:代码是在文章中从头开始编写的,请忽略可能的语法错误

如果我理解正确,您希望
SchoolSerializer
返回两层深的嵌套结构,但跳过中间模型。为此,我将在您的
学校
模型中创建一个方法来检索
桌面
实例:

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)
理解其工作原理的关键是用作
参数值的model方法必须只返回序列化程序模型的实例。序列化程序从那里获取它,以您在序列化程序中定义的方式呈现对象(在本例中为
DeskSerializer


希望这能有所帮助。

您可以通过以下查询完成:desks=Desk.objects.filter(room\u school=self)