Django: Permission: app_label.codename をアノテートする

1
2
3
from django.db.models import F, Value
from django.db.models.functions import Concat
from django.contrib.auth import models as auth_models
1
2
3
4
5
6
7

class PermissionDef:
    @classmethod
    def choices(cls):
        return auth_models.Permission.objects.annotate(
            code=Concat("content_type__app_label", Value("."), "codename")
        ).values_list("code", "name")

ただし、件数が大きいので, フィールドのchoices に使うのは現実的ではない