Django - 按条件订购 ArrayAgg

问题描述 投票:0回答:0

我有一个名为 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']
django-views django-queryset array-agg
© www.soinside.com 2019 - 2024. All rights reserved.