在定义了一个直通模型之后,如何对字段的返回对象进行默认排序?

2024-09-25 00:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

摘要

如下所示定义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。我甚至尝试过刷新页面,看看如果没有按顺序出现的数字,显示是否会随机变化,但是没有,在数字发生变化之前,它们都会保持这种顺序,但是没有按照我能理解的逻辑排序?在


Tags: 项目订单selfgetreturn排序modelsdef
2条回答

首先,如果您想使排序中间层Model,那么您应该创建自定义中间层Model(显式)。你已经做到了。另外,您试图重写get_queryset()实例方法,在您的Model类中,但这一点都不重要。get_queryset()Manager/BaseManager类的方法,而不是{}类的方法。在

你可以试试这个

SetMeta.objects.filter(item_id=ITEM_ID).order_by('order')

或者

^{pr2}$

另外,使用select_related()QuerySet方法访问相关对象并避免大量的DB点击。它执行SQL JOINS。没别的了。在

SetMeta.objects.select_related('item').filter(item_id=ITEM_ID).order_by('order')

或者

SetMeta.objects.select_related('set').filter(set_id=SET_ID).order_by('order')

另外,您可以在SetMeta类上设置默认排序规则。在

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,)

    class Meta:
        ordering = ('order',)

查询中的用法

items = Item.objects.all()

m2m_model_qs = SetMeta.objects.select_related('item', 'set').filter(item_id__in=items).order_by('order') # performs SQL SubSelect
for instance in m2m_model_qs:
    print(instance) # this is instance of m2m model
    print(instance.item) # this is instance of Item model. you can access columns also. "instance.item.title"
    print(instance.set) # this is instance of Set model. you can access columns also. "instance.set.pk" # for example.

希望对你有帮助。在

多亏了以上两位投稿人的帮助,我终于明白了这一点。我刚刚在我的集合上定义了一个模型方法,它可以满足我的需要。在

class Set(Item):
    front_page = models.BooleanField(max_length=300, blank=False, default=False, null=False)
    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 order(self):
        return self.items.all().order_by('itemOrder__order')

    def __str__(self):
        return self.title

相关问题 更多 >