【发布时间】:2022-09-23 17:37:20
【问题描述】:
我在广告、产品和商店之间有一个链接,我想在管理员中按商店对它们进行排序:
class Ad(models.Model):
products = models.ManyToManyField(Product, blank = True)
device = models.ForeignKey(Display, on_delete = models.CASCADE)
class Product(models.Model):
name = models.CharField(\"name\", max_length = 128)
store = models.ForeignKey(Store, on_delete = models.CASCADE)
class Store(models.Model):
name = models.CharField(\"name\", max_length = 128)
所以每个广告可以有 0、1、2、3 ... 产品链接到它。现在我想在广告管理列表中使字段“存储”可排序,因此我试图覆盖AdAdmin 的get_queryset 方法,但被卡住了:
class AdAdmin(admin.ModelAdmin):
list_display = [\"get_store\", ... ]
def get_queryset(self, request):
qs = super().get_queryset(request)
qs = qs.annotate(storename = ####)
return qs
@admin.display(ordering = \"storename\")
def get_store(self, obj):
try:
return obj.products.all().first().store.name
except AttributeError:
try:
return obj.device.store.name
except AttributeError:
return \"NEW\"
所以我想用storename 注释我的查询集,并且我希望能够在Ad 列表管理页面上按字母顺序对store.name 进行排序。我已经知道如何注释空商店:
qs = qs.annotate(storename = Case(When(products_pk__isnull = True, then = Value(\"NEW\"), default = Value(\"old\")))
但这只是让我到目前为止......我将如何使用我给定的逻辑将值store.name 动态分配给default?
每个广告都有一个条件:它只能链接到同一家商店的(许多)产品。
标签: django-admin django-orm django-annotate django-aggregation