如何使包含其他模型的项目的查询集合

问题描述:

因此,我有一个模型与我拥有的所有项目的列表。 和其他模型有外键到我的主要模型...如何使查询设置对象。包含我的第二个模型的第一个模型中的所有项目?如何使包含其他模型的项目的查询集合

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


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

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

如何使播放列表中的音乐查询设置为obj?

就是这样。

playlist = Playlist.objects.get(**conditions) 
music = Music.objects.filter(playlist = playlist) 

然后iwant使.aggregate计算所有播放列表的持续时间。

Sum类(django.db.models)使用Django注释。

from django.db.models import Sum 
qs = Music.objects.filter(playlist = playlist).annotate(total = 
    Sum('duration')) 

更新

音乐模式没有属性的播放列表(读@波尔的评论后)...

  1. 你得到一个错误?如果是这样,请发布您使用的代码和堆栈跟踪。我在本地测试了你的模型,上面给出的过滤器/注释工作正常。
  2. 你的模型对我来说没有意义。我期望MusicPlaylist模型有一个多对多的关系。如果失败,Playlist应该有多个关联的Music实例。即外键应该在Music之内,而不是像现在这样。

更新2

(读@波尔的评论后)

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

没有必要更改您的Music模型或基础表。您可以添加一个新的模式Playlist结构如下:

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

现在,您可以下降现有的播放表并执行python manage.py syncdb。将为Playlist创建新表,并为多对多创建连接表。

这就是说我必须添加一个法定警告,这不是管理模型更改的好方法。使用迁移工具如South会更好。 South会让你更加优雅地处理迁移,特别是当涉及到数据变更时。

+0

音乐模型还没有属性播放列表... – Pol 2010-09-08 15:00:06

+0

@Pol:更新了我的答案。往上看。 – 2010-09-08 16:40:12

+0

是的......你说得对......它必须是多对多......但不是......我该怎么办?而音乐在数据库中已经成为大牌桌。我只需要添加对播放列表的支持...... – Pol 2010-09-08 16:47:09