how to sort by property ?

Issue #64 invalid
Royhan Anwar created an issue

I have models.py

class Lot(models.Model):

    no = models.CharField(max_length=20, db_index=True)
    is_delete = models.BooleanField(default=False)
    created_user = models.CharField(max_length=32)
    updated_user = models.CharField(max_length=32, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.no

    @property
    def get_number_of_orders(self):
        count = LotDetail.objects.filter(lot_id=self.id).count()
        return count


class LotDetail(models.Model):

    lot = models.ForeignKey(Lot, on_delete=models.PROTECT, related_name='lots')
    order = models.ForeignKey(Order, on_delete=models.PROTECT, related_name='orders')
    is_delete = models.BooleanField(default=False)
    created_user = models.CharField(max_length=32)
    updated_user = models.CharField(max_length=32, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return '{0}-{0}'.format(self.lot.no, self.order.no_from_ec)

and views.py

class LotIndex(TemplateView):

    template_name = 'tracking/lot/index.html'


class LotDataTable(BaseDatatableView):

    model = Lot
    columns = ['pk', 'no', 'get_number_of_orders']
    order_column = ['no', 'get_number_of_orders']
    max_display_length = 20

    def get_initial_queryset(self):
        return Lot.objects.filter(is_delete=False).all()

when i press sort by get_number_of_orders, 'it raise error no field called "get_number_of_orders".

Thank you :)

Comments (2)

  1. Maciej Wisniowski repo owner

    Sorting is done on the database level so it is not possible to sort by the result of the method/property defined directly on the model.

    In this specific case you can write a query using annotate and Count methods that will add new field to the resultset/database and it should be possible to sort by this new field.

  2. Log in to comment