如何使包含其他模型的项目的查询集合
问题描述:
因此,我有一个模型与我拥有的所有项目的列表。 和其他模型有外键到我的主要模型...如何使查询设置对象。包含我的第二个模型的第一个模型中的所有项目?如何使包含其他模型的项目的查询集合
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'))
更新
音乐模式没有属性的播放列表(读@波尔的评论后)...
- 你得到一个错误?如果是这样,请发布您使用的代码和堆栈跟踪。我在本地测试了你的模型,上面给出的过滤器/注释工作正常。
- 你的模型对我来说没有意义。我期望
Music
和Playlist
模型有一个多对多的关系。如果失败,Playlist
应该有多个关联的Music
实例。即外键应该在Music
之内,而不是像现在这样。
更新2
(读@波尔的评论后)
是的...您的权利...它必须是多对多的..但它不是.. 。 我该怎么办?而音乐在数据库中已经成为大牌桌。我只需要添加对播放列表的支持....
没有必要更改您的Music
模型或基础表。您可以添加一个新的模式Playlist
结构如下:
class Playlist(models.Model):
music = models.ManyToManyField(Music)
现在,您可以下降现有的播放表并执行python manage.py syncdb
。将为Playlist
创建新表,并为多对多创建连接表。
这就是说我必须添加一个法定警告,这不是管理模型更改的好方法。使用迁移工具如South会更好。 South会让你更加优雅地处理迁移,特别是当涉及到数据变更时。
音乐模型还没有属性播放列表... – Pol 2010-09-08 15:00:06
@Pol:更新了我的答案。往上看。 – 2010-09-08 16:40:12
是的......你说得对......它必须是多对多......但不是......我该怎么办?而音乐在数据库中已经成为大牌桌。我只需要添加对播放列表的支持...... – Pol 2010-09-08 16:47:09