Search code examples
pythondjangodjango-modelsdjango-querysetdjango-orm

how can I use django model method for ordering in meta class


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?


Solution

  • 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()