Найти - Пользователи
Полная версия: Топ пользователей через ForeignKey поле модели
Начало » Django » Топ пользователей через ForeignKey поле модели
1
Xa_xoo
Суть: необходимо составить топ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="Текст")
ilnur
ну а в чем сложность?
берете все коментарии за период, группируете по юзеру и агрегируете количесвто коментов, а дальше уже берете тех кого нада
Xa_xoo
ну вот, например (более простой пример), юзеры с большим кол-вом блогов за месяц. Выбираю блоги за месяц:
 today = datetime.date.today()
month_blogs = blogs.objects.filter(blogs_date__year = today.year, blogs_date__month = today.month)
как мне теперь выбрать юзера с большим кол-вом блогов? Т.е. из queryset вытащить blogs_user, посчитать и наибольшее повторение будет моим результатом? Как правильно написать этот ужас?
ilnur
 month_blogs.values("blogs_user").annotate(Count("id"))

количество постов для каждого пользователя
Xa_xoo
Спасибо большое, последний вопрос. Как мне в шаблоне не идишник пользователя, а его username отобразить?)
ilnur
 month_blogs.values("blogs_user__username").annotate(Count("id"))
ну читайте доки :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB