django - 확장 - 장고 어드민 커스터마이징




장고 관리자:데이터베이스 필드가없는 사용자 지정 list_display 필드 중 하나를 기준으로 정렬하는 방법 (2)

나는 이것을 테스트하지 않았지만 (그것이 효과가 있는지 알고 싶습니다.)하지만 집계 된 주문 수를 포함하는 Customer 용 맞춤 관리자를 정의한 다음 admin_order_field 를 해당 집계로 설정하는 것은 admin_order_field

from django.db import models 


class CustomerManager(models.Manager):
    def get_query_set(self):
        return super(CustomerManager, self).get_query_set().annotate(models.Count('order'))

class Customer(models.Model):
    foo = models.CharField[...]

    objects = CustomerManager()

    def number_of_orders(self):
        return u'%s' % Order.objects.filter(customer=self).count()
    number_of_orders.admin_order_field = 'order__count'

편집 : 난 그냥이 아이디어를 테스트했습니다 그리고 그것은 완벽하게 작동합니다 - 아무 django 관리자 서브 클래 싱 필요합니다!

# admin.py
class CustomerAdmin(admin.ModelAdmin):  
    list_display = ('foo', 'number_of_orders')

# models.py
class Order(models.Model):
    bar = models.CharField[...]
    customer = models.ForeignKey(Customer)

class Customer(models.Model):
    foo = models.CharField[...]
    def number_of_orders(self):
        return u'%s' % Order.objects.filter(customer=self).count()  

고객의 number_of_orders 에 따라 어떻게 고객을 분류 할 수 있습니까?

admin_order_field 속성은 정렬 할 데이터베이스 필드가 필요하므로 여기서는 사용할 수 없습니다. 장고는 정렬을 수행하기 위해 기본 DB를 사용하기 때문에 가능합니까? 주문 수를 포함하는 집계 필드를 만드는 것은 과장된 것 같습니다.

재미있는 점 : 브라우저에서 URL을 직접 변경하여이 열을 정렬하면 예상대로 작동합니다!


내가 생각할 수있는 유일한 방법은 필드를 비정규 화하는 것입니다. 즉, 파생 된 필드와 동기화되도록 업데이트되는 실제 필드를 만듭니다. 나는 대개 비정규 화 된 필드 나 그것이 파생 된 모델로 모델을 저장하는 것에 우선하여이 작업을 수행한다.

# models.py
class Order(models.Model):
    bar = models.CharField[...]
    customer = models.ForeignKey(Customer)
    def save(self):
        super(Order, self).save()
        self.customer.number_of_orders = Order.objects.filter(customer=self.customer).count()
        self.customer.save()

class Customer(models.Model):
    foo = models.CharField[...]
    number_of_orders = models.IntegerField[...]






django-admin