0

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?

Sunderam Dubey
  • 1
  • 11
  • 20
  • 40
  • Does this answer your question? [Ordering Django queryset by a @property](https://stackoverflow.com/questions/8478494/ordering-django-queryset-by-a-property) – Yevhen Kuzmovych Feb 09 '23 at 12:59

1 Answers1

0

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()
Sunderam Dubey
  • 1
  • 11
  • 20
  • 40
  • It doesn't work ( –  Feb 09 '23 at 19:16
  • @YazkhanovAli did you get any error? – Sunderam Dubey Feb 09 '23 at 19:27
  • yeah, ERRORS: ←[31;1mposts.Post: (models.E015) 'ordering' refers to the nonexistent field, related field, or lookup 'hotness'.←[0m –  Feb 09 '23 at 19:39
  • @YazkhanovAli one way is to override the manager. – Sunderam Dubey Feb 09 '23 at 19:40
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/251770/discussion-between-yazkhanov-ali-and-sunderam-dubey). –  Feb 09 '23 at 20:19
  • django.core.exceptions.FieldError: Cannot resolve keyword 'count' into field. Choices are: gorulen, id, post, title –  Feb 09 '23 at 20:20
  • I edited manager code and it works –  Feb 09 '23 at 20:52
  • 1
    class PostQuerySet(models.QuerySet): def hotness_ordering(self): return self.annotate(hotness=models.Count('like') + models.Count('seen') + models.F('share')).order_by('-hotness') –  Feb 09 '23 at 20:52