如何使QuerySet包含其他模型的项目

时间:2010-09-08 14:42:55

标签: django django-models

所以我有一个模型,列出了我拥有的所有项目。 和其他模型一样,对我的主模型有外键...如何制作查询集对象。在包含我的第二个模型的第一个模型的所有项目中?

class Music(models.Model):
    name=models.CharField()
    duration=models.IntegerField()


class Playlist(models.Model):
    misic=models.ForeignKey(Music)

如何制作播放列表中音乐的查询集obj?然后我想让.aggregate计算所有播放列表的持续时间。

1 个答案:

答案 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的评论后)

  

音乐模型没有属性播放列表...

  1. 您收到错误了吗?如果是这样,请使用您使用的代码并堆栈跟踪。我在本地测试了你的模型,上面给出的过滤器/注释工作得很好。
  2. 你的模特对我没有意义。我希望MusicPlaylist模型有多对多的关系。如果PlaylistMusic个实例关联,则失败。即外键应该在Music内,而不是像现在这样。
  3. 更新2

    (阅读@ Pol的评论后)

      是的......你是对的...它必须是多对多......但它不是......我该怎么办?音乐已经成为数据库中的大表。我只需要添加对播放列表的支持....

    无需更改Music模型或基础表。您可以使用以下结构添加新模型Playlist

    class Playlist(models.Model):
        music = models.ManyToManyField(Music)
    

    您现在可以删除现有播放列表表并执行python manage.py syncdb。将创建Playlist的新表以及多对多的连接表。

    那就是说我必须添加法定警告,这不是管理模型更改的好方法。使用South等迁移工具会更好。 South将让您更优雅地处理迁移,尤其是在涉及数据更改时。