Python Django Rest框架序列化程序关系:如何仅获取最新曲目的列表?
我正在关注这个文档。我正试图绞尽脑汁去查询相册对象,让它只返回最新的曲目,而不是返回所有的曲目。下面是文档模型和序列化程序的修改版本 模型Python Django Rest框架序列化程序关系:如何仅获取最新曲目的列表?,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我正在关注这个文档。我正试图绞尽脑汁去查询相册对象,让它只返回最新的曲目,而不是返回所有的曲目。下面是文档模型和序列化程序的修改版本 模型 class AlbumOwner(models.Model): username = models.CharField(max_length=100) class Album(models.Model): album_name = models.CharField(max_length=100) owner = models.For
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'
序列化程序
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')
我当前使用的查询如下,“o”表示所有者:
albums = Album.objects.filter(owner=o)
serializer = AlbumSerializer(albums)
serializer.data
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"}
],
},
]
我想要的响应是只返回最新日期的曲目:
[{
'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"}
],
},
]
尝试下面的方法,即切片轨迹查询集或根据某些过滤器选择最新的轨迹
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
尝试下面的方法,即切片轨迹查询集或根据某些过滤器选择最新的轨迹
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
谢谢你的回答,就几个问题:我需要打电话到任何地方吗?或者序列化程序是否足够聪明,能够使用它?什么是
source='latest_track'
引用?在这种情况下,我将进行多少次数据库调用?不,您不需要调用get\u tracks()
,它将按照get\u()
模式自动调用<代码>轨迹是本例中的示例()。我的坏,source='latest_track'
不应该在那里,已修复。它看起来像qs=album.tracks.all()[:1]
返回第一个创建的曲目,而不是最新创建的曲目。我已经为模型添加了顺序,它们应该按相反的时间顺序排序。我已尝试对您的查询进行更改,例如albumn.tracks.reverse()[0]
(对象上的错误不可编辑),qs=albumn.tracks..all()[1://code>(返回最新的2个条目,我只需要1个)。我在这里遗漏了什么?Album.tracks.reverse()[0]
return是一个单独的项,而不是一个iterable(list,queryset,…)。如果qs=album.tracks.all()[:1]
返回第一首曲目,请尝试使用qs=album.tracks.all()[-1:]
获取最后一首曲目。感谢您的回答,只需问几个问题:我需要在任何地方调用get\u tracks
吗?或者序列化程序是否足够聪明,能够使用它?什么是source='latest_track'
引用?在这种情况下,我将进行多少次数据库调用?不,您不需要调用get\u tracks()
,它将按照get\u()
模式自动调用<代码>轨迹
是本例中的示例()。我的坏,source='latest_track'
不应该在那里,已修复。它看起来像qs=album.tracks.all()[:1]
返回第一个创建的曲目,而不是最新创建的曲目。我已经为模型添加了顺序,它们应该按相反的时间顺序排序。我已尝试对您的查询进行更改,例如albumn.tracks.reverse()[0]
(对象上的错误不可编辑),qs=albumn.tracks..all()[1://code>(返回最新的2个条目,我只需要1个)。我在这里遗漏了什么?Album.tracks.reverse()[0]
return是一个单独的项,而不是一个iterable(list,queryset,…)。如果qs=album.tracks.all()[:1]
返回第一首曲目,请尝试使用qs=album.tracks.all()[-1:]
获取最后一首曲目。由于您知道get_latest_by
,因此可以使用曲目管理器的.latest()-track.objects.latest()并将其馈送至TrackSerializer-无需切片。因为您知道通过
获取最新信息,所以可以使用轨迹管理器的.latest()-Track.objects.latest()并将其馈送至TrackSerializer-无需切片。