2015-07-21 6 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 лучших видеороликов и количество пользователей, просмотренных этими видео?

+0

Что такое '' time' в WatchedVideo'? Это количество раз, когда пользователь просматривал видео? – cezar

+0

@cezar не просматривается время i.e на сколько часов просматривается видео. – Naresh

+0

Просто замечание об условных обозначениях кодирования: было бы лучше переименовать 'videoData' в' WatchedVideo' в 'video_data', чтобы соответствовать остальным. – cezar

ответ

3

Используйте функцию Count из Джанго ОРМ:

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

Человек, ты гений! – cezar

+0

Просто дополнительная информация: OP должен назначить этот запрос для переменной, скажем, «видео», а затем вызвать количество просмотров видео: «видео [0] .watches_count' для первого ранжированного видео. – cezar

+0

еще одна вещь .... как я буду фильтровать 10 лучших городов по количеству пользователей ... – Naresh

Смежные вопросы