Django按计数(@property)在多对多中排序?

时间:2018-03-22 10:30:28

标签: python django python-3.x

我有以下课程:

class Site(models.Model):
    articles = models.ManyToManyField(Article, blank=True, null=True)
    products = models.ManyToManyField(Product, blank=True, null=True)


class Product(models.Model):
    @property
    def sites_count(self):
        return self.site_set.count()

在我的管理员中,我希望通过sites_count对多对多关系进行排序。

class SiteAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "articles":
             kwargs['queryset'] = Article.objects.order_by('sites_count')
        return super().formfield_for_manytomany(self, db_field, request, **kwargs)

我抱怨不能使用sites_count,因为它不是我的数据库中的列。

对此有何替代方法?

1 个答案:

答案 0 :(得分:2)

您可以使用聚合和订单。

from django.db.models import Count
Article.objects.annotate(site_count=Count('site')).order_by('site_count')