2015-07-21 105 views
1

我有兩個模型User和VideoData。這兩個模型包含每個用戶的詳細信息以及該用戶觀看的視頻。我使用了多對多的關係。現在我想按用戶數量篩選前10名視頻。在Django中註釋多對多關係

class User(models.Model): 
    user_id = models.CharField(max_length=40,unique=True) 
    user_name = models.CharField(max_length=40) 
    user_email = models.EmailField() 
    user_city = models.CharField(max_length=40) 
    videos_watched = models.ManyToManyField('VideoData', through='WatchedVideo') 
    class Meta: 
     ordering = ['user_id'] 
     verbose_name = 'User MetaData' 
     verbose_name_plural = 'Users MetaData' 
    def __unicode__(self): 
     return self.user_id 

class VideoData(models.Model): 
    video_id = models.CharField(max_length=40,unique=True) 
    video_name = models.CharField(max_length=40) 
    class Meta: 
     verbose_name = 'User_Video MetaData' 
     verbose_name_plural = 'Users_Video MetaData' 
    def __unicode__(self): 
     return self.video_name  

class WatchedVideo(models.Model): 
    user = models.ForeignKey(User, to_field = 'user_id') 
    videoData = models.ForeignKey(VideoData, to_field = 'video_id') 
    time = models.PositiveIntegerField(null = True) 

我該如何註釋前10個視頻和觀看這些視頻的用戶數?從Django的ORM

+0

什麼是'time'在'WatchedVideo'?這是用戶觀看視頻的次數嗎? – cezar

+0

@cezar沒有時間觀看時間,即視頻觀看了多少小時。 – Naresh

+0

只是對編碼約定的一個評論:最好將'WatchedVideo'中的'videoData'重命名爲'video_data'以符合其餘的。 – cezar

回答

3

使用計數功能:

VideoData.objects.annotate(
     watches_count=models.Count('user_set') 
    ).order_by('-watches_count')[:10] 
+1

男人,你是個天才! – cezar

+0

只是一個補充信息:OP應該把這個查詢集分配給一個變量,讓我們說'視頻',然後調用視頻的觀看次數,如下:'videos [0] .watches_count'爲第一個排名的視頻。 – cezar

+0

還有一件事....我將如何根據用戶數過濾前10個城市... – Naresh