Топ пользователей через ForeignKey поле модели - Python
Формулировка задачи:
Суть: необходимо составить топ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="Текст")
Решение задачи: «Топ пользователей через ForeignKey поле модели»
textual
Листинг программы
- month_blogs.values("blogs_user").annotate(Count("id"))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д