我有一个名为 Media 的 Django 模型,它通过外键与 Product 模型相关。媒体模型有一个 image 字段和一个 status 字段,可以采用三个值之一:“Primary”、“Secondary”或“Extra”。我使用 ArrayAgg 函数聚合每个产品的图像 URL,同时排除状态为“Extra”的图像。但是,我想根据 status_order_map 中定义的自定义条件对聚合 URL 进行排序。
这是我当前的聚合代码片段:
class Media(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='media')
image = models.ImageField(upload_to='images/products')
status = models.CharField(max_length=9, choices=[
('Primary', 'Primary'),
('Secondary', 'Secondary'),
('Extra', 'Extra')
], default='Extra')
# ...
class ProductListView(ListView):
model = Product
def get_queryset(self):
queryset = queryset.annotate(
image_urls=ArrayAgg('media__image', distinct=True, filter=~Q(media__status='Extra')),
)
status_order_map = {
'Primary': 0,
'Secondary': 1
}
现在,我想根据 status_order_map 中定义的顺序对查询集中的 image_urls 数组进行排序。换句话说,image_urls 数组应首先按“Primary”排序,然后按“Secondary”排序。
任何帮助或指导将不胜感激!谢谢!
尝试:
queryset = queryset.annotate(
status_order=ArrayAgg(Case(
*[When(media__status=status, then=Value(order)) for status, order in status_order_map.items()],
default=Value(999),
output_field=IntegerField(),
), distinct=True),
image_urls=ArrayAgg('media__image', distinct=True, filter=~Q(media__status='Extra')),
)
但我得到了
STATUS_ORDER, IMAGE_URLS
[0, 1], ['url1', 'url0']