Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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框架将模型嵌套为列表而不是dict_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django Rest框架将模型嵌套为列表而不是dict

Python Django Rest框架将模型嵌套为列表而不是dict,python,django,django-rest-framework,Python,Django,Django Rest Framework,有没有办法将嵌套模型作为列表而不是Dict? 我正试图用ListField实现它,但遇到了困难。 下面是一个例子,以更好地解释我正在尝试做什么 示例模型: class Album(models.Model): name = models.CharField(max_length=250) class Track(models.Model): title = models.CharField(max_length=250) number = models.IntegerF

有没有办法将嵌套模型作为列表而不是Dict?
我正试图用ListField实现它,但遇到了困难。
下面是一个例子,以更好地解释我正在尝试做什么

示例模型:

class Album(models.Model):
    name = models.CharField(max_length=250)

class Track(models.Model):
    title = models.CharField(max_length=250)
    number = models.IntegerField()
    album = models.ForeignKey(Album, related_name="tracks")
Class TrackSerializer(serializers.ModelSerializer):
    class Meta:
    model = Track
    fields = ['number', 'title']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True)
    model = Album
    fields = ['name', 'tracks']
{
    "name": "ALBUM NAME",
    "tracks": [
        {
            "number": 1,
            "title": "TRACK TITLE"
        },
        {
            "number": 2,
            "title": "OTHER TRACK TITLE"
        }
    ]
}
{
    "name": "ALBUM NAME",
    "tracks": [
        [1, "TRACK TITLE"],
        [2, "OTHER TRACK TITLE"]
    ]
}
示例序列化程序:

class Album(models.Model):
    name = models.CharField(max_length=250)

class Track(models.Model):
    title = models.CharField(max_length=250)
    number = models.IntegerField()
    album = models.ForeignKey(Album, related_name="tracks")
Class TrackSerializer(serializers.ModelSerializer):
    class Meta:
    model = Track
    fields = ['number', 'title']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True)
    model = Album
    fields = ['name', 'tracks']
{
    "name": "ALBUM NAME",
    "tracks": [
        {
            "number": 1,
            "title": "TRACK TITLE"
        },
        {
            "number": 2,
            "title": "OTHER TRACK TITLE"
        }
    ]
}
{
    "name": "ALBUM NAME",
    "tracks": [
        [1, "TRACK TITLE"],
        [2, "OTHER TRACK TITLE"]
    ]
}
上述代码导致输出错误:

class Album(models.Model):
    name = models.CharField(max_length=250)

class Track(models.Model):
    title = models.CharField(max_length=250)
    number = models.IntegerField()
    album = models.ForeignKey(Album, related_name="tracks")
Class TrackSerializer(serializers.ModelSerializer):
    class Meta:
    model = Track
    fields = ['number', 'title']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True)
    model = Album
    fields = ['name', 'tracks']
{
    "name": "ALBUM NAME",
    "tracks": [
        {
            "number": 1,
            "title": "TRACK TITLE"
        },
        {
            "number": 2,
            "title": "OTHER TRACK TITLE"
        }
    ]
}
{
    "name": "ALBUM NAME",
    "tracks": [
        [1, "TRACK TITLE"],
        [2, "OTHER TRACK TITLE"]
    ]
}
所需输出:

class Album(models.Model):
    name = models.CharField(max_length=250)

class Track(models.Model):
    title = models.CharField(max_length=250)
    number = models.IntegerField()
    album = models.ForeignKey(Album, related_name="tracks")
Class TrackSerializer(serializers.ModelSerializer):
    class Meta:
    model = Track
    fields = ['number', 'title']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True)
    model = Album
    fields = ['name', 'tracks']
{
    "name": "ALBUM NAME",
    "tracks": [
        {
            "number": 1,
            "title": "TRACK TITLE"
        },
        {
            "number": 2,
            "title": "OTHER TRACK TITLE"
        }
    ]
}
{
    "name": "ALBUM NAME",
    "tracks": [
        [1, "TRACK TITLE"],
        [2, "OTHER TRACK TITLE"]
    ]
}

解决方案:带有一个字段的相册序列化程序,该字段是方法的结果,可以是任何内容(SerializerMethodField)

序列化程序.py

class AlbumSerializer(serializers.ModelSerializer):
    track_list = serializers.SerializerMethodField()
    class Meta:
        model = Album
        fields = ['name', 'track_list']
    class get_track_list(self, obj):
        output = []
        for i in Track.objects.filter(album = obj.id):
            output.append([i.number, i.title])
        return output
这将返回一个带有属性“name”和“track_list”的JSON,这正是我需要的方式:

{
    "name": "ALBUM NAME",
    "track_list": [
        [1, "TRACK TITLE"],
        [2, "OTHER TRACK TITLE"]
    ]
}

您试图构建的格式很奇怪,但仍然可以使用
SerializerMethodField
实现。除非您也希望它是可写的,否则在这种情况下,您必须实现自己的序列化器子类。这确实很奇怪,但我能够通过
SerializerMethodField
实现它。谢谢!