models.py:
class Post(models.Model):
title = models.CharField(max_length=255, verbose_name="ady")
text = RichTextField(verbose_name="text")
tagList = models.ManyToManyField(Tag, verbose_name="taglar", related_query_name="tagList")
image = models.ImageField(upload_to="postImage/", verbose_name="surat")
seen = models.ManyToManyField(UserId,verbose_name="görülen sany", blank=True, related_name="gorulen")
like = models.ManyToManyField(UserId,verbose_name="like sany", blank=True)
share = models.PositiveIntegerField(verbose_name="paýlaşylan sany", null=True, blank=True, default="0")
createdAt = models.DateTimeField(auto_now_add=True, verbose_name="goşulan güni")
class Meta:
verbose_name_plural="Makalalar"
# ordering = ("-createdAt",)
ordering = ["-hotness",]
def __str__(self):
return self.title
def likes(self):
return self.like.count()
likes.short_description = "Like sany"
likes.allow_tags = True
def seens(self):
return self.seen.count()
seens.short_description = "Görülen sany"
seens.allow_tags = True
@property
def hotness(self):
return self.likes() + self.seens() + self.share
How can I user hotness function value to ordering in meta class?
You can define a custom manager for the Post
model and implement a custom queryset as:
class PostQuerySet(models.QuerySet):
def hotness_ordering(self):
return self.annotate(hotness=models.Count('like') + models.Count('seen') + models.F('share')).order_by('-hotness')
Then simply query as:
Post.objects.all()