@fantom_ask

Как мне фильтровать посты по рейтингу?

У меня есть несколько моделей
class RaringStar(models.Model):
	value = models.IntegerField('star')
	def __str__(self):
		return str(self.value)

class Article(models.Model):
	article_title = models.CharField('Title', max_length = 200)
	article_text = models.TextField('TEXT', null=True, blank=True)
	
class Raring(models.Model):
	star =  models.ForeignKey(RaringStar, on_delete=models.CASCADE)
	post =  models.ForeignKey(Article, on_delete=models.CASCADE)
	ip = models.CharField('ip', max_length = 200)

я прочитал доки
https://docs.djangoproject.com/en/3.0/topics/db/qu...
https://docs.djangoproject.com/en/3.0/ref/models/q...

Но я так и не понял как мне вывести модели по рейтингу

a = Article.objects.filter(raring__isnull=False)
for x in a:
	obj = {}
	x.raring_set.order_by('-val')
	val = 0
	for y in x :
		val + x.star
	obj['val.sum'] = {'title':x.article_title,'val_sum':val} 
obj.order_by('-val_sum')


Так что бы мне не пришлось вызывать все объекты по нескольку раз а после конвертировать новый объект и к нему применять сортировку, так как здесь очень много лишних действий
  • Вопрос задан
  • 29 просмотров
Пригласить эксперта
Ответы на вопрос 2
@bacon
Чтобы не "вызывать все объекты по нескольку раз" или не делать каждый раз в запросах count со связанными таблицами, используют денормализацию. В Article добавляют поле с текущим значением рейтинга, которое пересчитываться каждый раз, когда кто-то меняет рейтинг (через save или сигналы).
ЗЫ не надо так называть поля article_title, article_text, надо просто title и text
Ответ написан
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Лучше конечно денормализовать, но если вот прям на лету надо, то вот:
Article.objects.annotate(avg_rating=Avg('rating__star')).filter(avg_rating__gte=3)

И да, придется исправить опечатки и несоответствия вашим моделям)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы