Форум сайта python.su
Суть: необходимо составить топ3 пользователей текущего месяца по показателю “комментарии”. Для выборки по датам использую pytz.
Есть 3 связанные модели: пользователи, блоги, комментарии к блогам. Соответственно поле комментарии в моделе “пользователи” - это обычный счетчик. После добавление комента в модель “комментарии к блогам” делаю += 1, но дата, когда был сделан комент, не регистрируется.
Реально ли с таким набором данных реализовать это? Если нет, то чтобы добавить?
Модель пользователя:
class AuthUser(AbstractBaseUser, PermissionsMixin): alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', message='Only alphanumeric characters are allowed.') username = models.CharField(unique=True, max_length=33, validators=[alphanumeric]) email = models.EmailField(verbose_name='email', unique=True, max_length=255, blank=True, null=True) first_name = models.CharField(max_length=50, null=True, blank=True) second_name = models.CharField(max_length=50, null=True, blank=True) last_name = models.CharField(max_length=50, null=True, blank=True) nickname = models.CharField(max_length=33, null=True, blank=True) date_joined = models.DateTimeField(default=timezone.now()) birthday = models.DateField(null=True, blank=True) is_active = models.BooleanField(default=True, null=False) is_staff = models.BooleanField(default=False, null=False) perm_user = models.IntegerField(default=0, null=True, blank=True) # 0 - user, 1 - admin user_img = models.ImageField(upload_to='user_img', blank=False, null=False, default='user_img/default_img.jpg') user_likes = models.IntegerField(default=0, null=True, blank=True) # кол-во полученых лайков user_com = models.IntegerField(default=0, null=True, blank=True) # кол-во комментариев user_action = models.IntegerField(default=0, null=True, blank=True) # кол-во добавлений user_blogs = models.IntegerField(default=0, null=True, blank=True) # кол-во тем user_checks = models.IntegerField(default=0, null=True, blank=True) # кол-во созданных чеков user_info = models.TextField(max_length=5512, null=True, blank=True) user_vip = models.BooleanField(default=False, null=False) # для донатеров objects = AuthUserManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['email'] def get_full_name(self): return '%s %s %s' .format(self.last_name, self.first_name, self.second_name) def get_short_name(self): return self.username def __str__(self): return '%s %s %s' % (self.last_name, self.first_name, self.second_name) class Meta(): db_table = "Пользователи"
class blogs(models.Model): class Meta(): db_table = "Блоги,рецепты,советы" blogs_title = models.CharField(max_length=300, verbose_name="Название Блога", help_text="Название Блога") blogs_cat = models.ForeignKey(blog_cat, verbose_name="Категория") blogs_user = models.ForeignKey(AuthUser, null=True, blank=True) blogs_date = models.DateTimeField(default=timezone.now()) blogs_date_edit = models.DateTimeField(blank=True, null=True) blogs_text = models.TextField(max_length=113000, null=True, blank=True, verbose_name="Текст", help_text="Текст") blogs_like = models.IntegerField(default=0, verbose_name="Лайки", null=True, blank=True) blogs_looks = models.IntegerField(default=0, verbose_name="Просмотров", null=True, blank=True) def __str__(self): return self.blogs_title class blog_com(models.Model): class Meta(): db_table = "blog_Комментарии" blog_com_blogs = models.ForeignKey(blogs, verbose_name="Блог") blog_com_date = models.DateTimeField(default=timezone.now(), verbose_name="Дата создания") blog_com_user = models.ForeignKey(AuthUser, null=True, blank=True) blog_com_text = models.TextField(max_length=7700, null=True, blank=True, verbose_name="Текст", help_text="Текст")
Офлайн
ну а в чем сложность?
берете все коментарии за период, группируете по юзеру и агрегируете количесвто коментов, а дальше уже берете тех кого нада
Офлайн
ну вот, например (более простой пример), юзеры с большим кол-вом блогов за месяц. Выбираю блоги за месяц:
today = datetime.date.today() month_blogs = blogs.objects.filter(blogs_date__year = today.year, blogs_date__month = today.month)
Офлайн
month_blogs.values("blogs_user").annotate(Count("id"))
Отредактировано ilnur (Сен. 8, 2016 15:58:06)
Офлайн
Спасибо большое, последний вопрос. Как мне в шаблоне не идишник пользователя, а его username отобразить?)
Офлайн
month_blogs.values("blogs_user__username").annotate(Count("id"))
Офлайн