2017-09-02 76 views
-1

我想创建一个网站,您可以播放来自不同专辑的歌曲。 我认为一切工作正常,但我坚持只有一件事。在专辑的细节中,我也想显示它包含的歌曲的数量。如何计算python中子类的实例数量?

这里是我的模型:

from django.contrib.auth.models import Permission, User 
from django.db import models 


class Album(models.Model): 
    user = models.ForeignKey(User, default=1) 
    artist = models.CharField(max_length=250) 
    album_title = models.CharField(max_length=500) 
    genre = models.CharField(max_length=100) 
    album_logo = models.FileField() 
    is_favorite = models.BooleanField(default=False) 

    def __str__(self): 
     return self.album_title + ' - ' + self.artist 


class Song(models.Model): 
    album = models.ForeignKey(Album, on_delete=models.CASCADE) 
    song_title = models.CharField(max_length=250) 
    audio_file = models.FileField(default='') 
    is_favorite = models.BooleanField(default=False) 

    def __str__(self): 
     return self.song_title 

如何在专辑的细节显示的歌曲数量?

+0

这与子类无关。 –

回答

0

您可以过滤,然后通过给出该特定专辑的专辑ID来计算歌曲的数量。

total_songs = Song.objects.filter(album__id='albumid').count() 
+1

更好地执行'album_id ='albumid''并避免表连接。 'album_id'已经是Song模型的一部分。 –

+0

album__id表示首先引用相册模型,然后使用相册模型的ID或主键。我认为这是更好的选择。 –

+0

@MosesKoledoye我在说'album__id'而不是'album_id'。 –

0

您可以标注在你使用检索专辑当前查询集的歌曲数量:

from django.db.models import Count 

album_qs = Album.objects.filter(...) # your queryset 
album_qs = album_qs.annotate(num_of_songs=Count('song')) 

num_of_songs将是在查询集的每个对象访问,就像任何的其他型号字段:

for album in album_qs: 
    print(album.artist) 
    print(album.num_of_songs) # use-case 

参考:

https://docs.djangoproject.com/en/1.11/topics/db/aggregation/