gpt4 book ai didi

Django ListView 忽略 get_Queryset 中的 Order_by

转载 作者:行者123 更新时间:2023-12-04 14:54:35 24 4
gpt4 key购买 nike

我正在尝试通过 get_queryset() 函数和使用 order_by() 来编辑 listView 中的顺序当我尝试打印生成的查询时,它会忽略 order_by 查询并仅使用我的模型类中 Meta 类中的默认顺序你知道为什么会这样吗?这是我的 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 s 是(或多或少)不可变的,因此您应该构造查询集的有序变体:

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

View 因此看起来像:

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

关于Django ListView 忽略 get_Queryset 中的 Order_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68325723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com