Django Rest Framework Serializer Relations:如何获取仅最新曲目的列表?

Ala*_*lan 1 python django serialization django-rest-framework

我在这里关注这个文档。我试图让我能够查询 Album 对象并让它只返回最新的曲目而不是返回所有曲目。以下是文档模型和序列化程序的修改版本。

楷模

class AlbumOwner(models.Model):
    username = models.CharField(max_length=100)

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    owner = models.ForeignKey(AlbumOwner, related_name='owner', on_delete=models.CASCADE)

class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)   

    class Meta:
        get_latest_by = 'created_at'
Run Code Online (Sandbox Code Playgroud)

序列化器

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('title', 'created_at')

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'tracks')
Run Code Online (Sandbox Code Playgroud)

我目前使用的查询如下,“o”代表所有者:

albums = Album.objects.filter(owner=o)
serializer = AlbumSerializer(albums)
serializer.data
Run Code Online (Sandbox Code Playgroud)

Serializer.data 将返回类似于以下内容的响应:

[{
    'album_name': 'The Grey Album',
    'tracks': [
        {'title': 'Public Service Announcement', "created_at": "2018-06-15T06:22:35.680291Z"},
        {'title': 'What More Can I Say', "created_at": "2014-07-15T06:22:35.680291Z"},
        {'title': 'Encore', "created_at": "2016-07-15T06:22:35.680291Z"}
    ],
},{
    'album_name': 'The Blue Album',
    'tracks': [
        {'title': 'PSA', "created_at": "2002-07-15T06:22:35.680291Z"},
        {'title': 'WMCIS', '"created_at": "2003-07-15T06:22:35.680291Z"},
        {'title': 'E', "created_at": "2005-07-15T06:22:35.680291Z"}
    ],
},
]
Run Code Online (Sandbox Code Playgroud)

我想要的响应是只返回最新日期的曲目:

[{
        'album_name': 'The Grey Album',
        'tracks': [
            {'title': 'Public Service Announcement', "created_at": "2018-06-15T06:22:35.680291Z"}
        ],
    },{
        'album_name': 'The Blue Album',
        'tracks': [
            {'title': 'E', "created_at": "2005-07-15T06:22:35.680291Z"}
        ],
    },
    ]
Run Code Online (Sandbox Code Playgroud)

Duš*_*ďar 6

尝试类似下面的操作,即对曲目查询集进行切片或根据某些过滤器选择最新的曲目。

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.SerializerMethodField()

    class Meta:
        model = Album
        fields = ('album_name', 'tracks')

    def get_tracks(self, album):
        qs = album.tracks.all()[-1:]
        return TrackSerializer(qs, many=True, read_only=True).data
Run Code Online (Sandbox Code Playgroud)