Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 Rest Framework - Fatal编程技术网

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-无需切片。