Django ListView 忽略 get_Queryset 中的 Order_by

Django ListView ignore Order_by in get_Queryset

我正在尝试通过 get_queryset() 函数并使用 order_by() 编辑列表视图中的顺序 当我尝试打印生成的查询时,它会忽略 order_by 查询并仅使用我的模型 class 中 Meta class 中的默认顺序 你知道为什么会这样吗? 这是我的 view.py 文件

class TagsListView(ListView):
    
    model = Tag

    paginate_by = 250
    ordering = ['-tag']

    def get_queryset(self):

        queryset = Tag.objects.all()
        queryset.order_by('slug',  )

        # se presente type nell'url aggiunge il filtro 
        category = self.request.GET.get("category", None)
        # type = self.kwargs.get('type', None)
        if category :
            queryset = queryset.filter( category=category )

        search = self.request.GET.get("search", None)
        if search :
            queryset = queryset.filter( tag__icontains=search )

        print('test ordering')
        queryset.order_by('slug', 'tag', 'date' )

        print(queryset.query.__str__())

        return queryset #aggiustare l'url

这是我的模型文件

# Create your models here.
class Tag(models.Model):

    GENERIC         = 0
    CONSOL          = 1
    SOCIETA         = 2
    SAGA            = 3
    CAT             = 4
    ALTRO           = 5
    CATEGORIES = [
            (GENERIC,'Generico'),
            (CONSOL,'Consol'),
            (SOCIETA,'Sport'),
            (SAGA,'Salute'),
            (CAT,'Categorie'),
            (ALTRO,'Tempo Libero'),
        ]

    tag = models.CharField(max_length=40, unique=True)
    slug = models.SlugField(max_length=40, unique=True)
    date = models.DateTimeField(default=timezone.now)
    category = models.IntegerField(choices=CATEGORIES, blank=True, default=GENERIC)
    custom = models.CharField(max_length=20, blank=True)

    class Meta:
        ordering = ('-date', 'tag') #ordinamento degli elementi
        pass

    def __str__(self):  #metodo righiesto
        return self.tag + " - " + self.slug

    def get_absolute_url(self):
        return reverse("tags:tag-detail", args=[self.slug,]) #article-deatil preso da urls.py

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.slug = slugify(self.tag, allow_unicode=True)
        pass

在控制台日志中我得到了 sql 打印

SELECT `tags_tag`.`id`, `tags_tag`.`tag`, `tags_tag`.`slug`, `tags_tag`.`date`, `tags_tag`.`category`, `tags_tag`.`custom` FROM `tags_tag` ORDER BY `tags_tag`.`date` DESC, `tags_tag`.`tag` ASC

而不是

SELECT `tags_tag`.`id`, `tags_tag`.`tag`, `tags_tag`.`slug`, `tags_tag`.`date`, `tags_tag`.`category`, `tags_tag`.`custom` FROM `tags_tag` ORDER BY `tags_tag`.`slug` ASC, `tags_tag`.`tag` ASC, `tags_tag`.`date` ASC

如果您实现 get_queryset 本身,它将 不会 对其进行排序,因为排序查询集的逻辑是由“父”实现的 get_queryset.

因此您需要自己添加 .order_by 子句。由于 QuerySet 是(或多或少) 不可变的 因此你应该构造一个查询集的有序变体:

#    ↓ assign to the queryset
<strong>queryset =</strong> queryset.order_by('slug', 'tag', 'date')

视图因此看起来像:

class TagsListView(ListView):
    model = Tag
    paginate_by = 250

    def get_queryset(self):
        queryset = Tag.objects.all()
        category = self.request.GET.get('category', None)
        if category :
            queryset = queryset.filter( category=category )

        search = self.request.GET.get("search", None)
        if search :
            queryset = queryset.filter(tag__icontains=search)
        <strong>queryset =</strong> queryset.order_by('slug', 'tag', 'date')
        return queryset