所以我有一个模型,列出了我拥有的所有项目。 和其他模型一样,对我的主模型有外键...如何制作查询集对象。在包含我的第二个模型的第一个模型的所有项目中?
class Music(models.Model):
name=models.CharField()
duration=models.IntegerField()
class Playlist(models.Model):
misic=models.ForeignKey(Music)
如何制作播放列表中音乐的查询集obj?然后我想让.aggregate
计算所有播放列表的持续时间。
答案 0 :(得分:1)
如何制作播放列表中音乐的查询集obj?
像这样。
playlist = Playlist.objects.get(**conditions)
music = Music.objects.filter(playlist = playlist)
然后我想制作.aggregate来计算所有播放列表的持续时间。
将Django注释与Sum
类(django.db.models)一起使用。
from django.db.models import Sum
qs = Music.objects.filter(playlist = playlist).annotate(total =
Sum('duration'))
<强>更新强>
(阅读@ Pol的评论后)
音乐模型没有属性播放列表...
Music
和Playlist
模型有多对多的关系。如果Playlist
与Music
个实例关联,则失败。即外键应该在Music
内,而不是像现在这样。 更新2
(阅读@ Pol的评论后)
是的......你是对的...它必须是多对多......但它不是......我该怎么办?音乐已经成为数据库中的大表。我只需要添加对播放列表的支持....
无需更改Music
模型或基础表。您可以使用以下结构添加新模型Playlist
:
class Playlist(models.Model):
music = models.ManyToManyField(Music)
您现在可以删除现有播放列表表并执行python manage.py syncdb
。将创建Playlist
的新表以及多对多的连接表。
那就是说我必须添加法定警告,这不是管理模型更改的好方法。使用South等迁移工具会更好。 South将让您更优雅地处理迁移,尤其是在涉及数据更改时。