【问题标题】:How to make annotation for foreign key in Django?如何在 Django 中为外键添加注释?
【发布时间】:2021-08-16 10:48:18
【问题描述】:

我需要用注释替换 _points 属性,以便我有机会按此值对 Django 管理面板中的条目进行排序。

我的模特:

class CustomUser(models.Model):
    inviter = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)

    @property
    def _points(self):
        res = CustomUser.objects.filter(inviter_id=self.id).count()
        return res 

我的管理员:

class CustomUserAdmin(admin.ModelAdmin):
    list_display = ['created', 'updated']

    def get_queryset(self, request):
        qs = super(CustomUserAdmin, self).get_queryset(request)
        qs = qs.annotate(points=(HOW TO CALCULATE _points HERE?).order_by('points')
        return qs

【问题讨论】:

    标签: django django-models django-admin django-annotate


    【解决方案1】:

    inviter 关系的相反方式是customuser,因此您可以将其实现为:

    from django.db.models import Count
    
    class CustomUserAdmin(admin.ModelAdmin):
        list_display = ['created', 'updated']
    
        def get_queryset(self, request):
            return super().get_queryset(request).annotate(
                points=Count('customuser')
            ).order_by('-points')

    不过,将inviterrelated_name=… [Django-doc] 重命名为invitees 可能更有意义:

    class CustomUser(models.Model):
        inviter = models.ForeignKey(
            'self',
            related_name='invitees',
            on_delete=models.SET_NULL,
            null=True,
            blank=True
        )
    
        @property
        def _points(self):
            return self.invitees.count()

    那么我们因此将其视为:

    class CustomUserAdmin(admin.ModelAdmin):
        list_display = ['created', 'updated']
    
        def get_queryset(self, request):
            return super().get_queryset(request).annotate(
                points=Count('invitees')
            ).order_by('-points')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2010-10-17
      • 1970-01-01
      • 2019-10-13
      • 2023-03-17
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多