摘要
如下所示定义get_queryset()没有按预期对具有order
整数的对象排序。我想订的是项目订单1项目订单2项目.订单3,但实际上我得到了12,1,6。甚至是8,13,2。在
return self.items.all().order_by('items','-itemOrder__order')
细节
我有一个Item
模型和Set
模型。集合与ManyToMany
有一个Item
的关系,因此每个Set
基本上都是{
问题是,当我展示这些物品时,没有订单,我希望能够随意订购。也就是说,不仅仅是日期或头衔。在
我定义了一个through
关系,其中Set
项是通过一个新的类SetMeta
定义的,该类有一个order
字段。我现在可以在我的web应用程序前端设置order
,但是对象的实际排序还没有起作用。在
模型.py
class Item(models.Model, AdminVideoMixin):
title = models.TextField(max_length=5000)
....
class Set(Item):
items = models.ManyToManyField(Item, related_name='in_sets', through='SetMeta', max_length=5000,)
def get_absolute_url(self):
return reverse('curate:set_detail',kwargs={'slug':self.slug})
def get_queryset(self):
return self.items.all().order_by('-itemOrder__order')
def __str__(self):
return self.title
class SetMeta(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='itemOrder', max_length=5000)
set = models.ForeignKey(Set, on_delete=models.CASCADE, related_name='SetOrder', max_length=5000)
order = models.IntegerField(default=0, null=True,)
def up(self):
self.order += 1
self.save()
print(self.order)
def down(self):
self.order -= 1
self.save()
print(self.order)
视图.py
^{pr2}$设置_编辑.html模板
^{3}$我添加了一个def get_queryset()函数,我认为是(?)是按itemOrder\uu order对字段排序,但它似乎没有这样做。在前端,我得到莫名其妙的命令。我可以对我的项目调用'up'和'down',甚至在前面显示order
值,这确实会改变,但是排序完全是随机变化的,我不知道使用什么逻辑来排序。我想看看IntergerField是不是真的是别的什么东西,比如CharField,但它不是。我查了数据库。在
例如,现在,项目按12,1,6的顺序显示。我可以修改这些值,顺序也可以是8,13,2。我甚至尝试过刷新页面,看看如果没有按顺序出现的数字,显示是否会随机变化,但是没有,在数字发生变化之前,它们都会保持这种顺序,但是没有按照我能理解的逻辑排序?在
首先,如果您想使排序中间层}类的方法。在
Model
,那么您应该创建自定义中间层Model
(显式)。你已经做到了。另外,您试图重写get_queryset()
实例方法,在您的Model
类中,但这一点都不重要。get_queryset()
是Manager/BaseManager
类的方法,而不是{你可以试试这个
或者
^{pr2}$另外,使用
select_related()
QuerySet
方法访问相关对象并避免大量的DB
点击。它执行SQL JOINS
。没别的了。在或者
另外,您可以在
SetMeta
类上设置默认排序规则。在查询中的用法
希望对你有帮助。在
多亏了以上两位投稿人的帮助,我终于明白了这一点。我刚刚在我的集合上定义了一个模型方法,它可以满足我的需要。在
相关问题 更多 >
编程相关推荐