【问题标题】:How do add +1 to the PositiveIntegerField model field when adding each new Post?添加每个新帖子时如何向 PositiveIntegerField 模型字段添加 +1?
【发布时间】:2021-09-29 16:49:54
【问题描述】:

我有一个Posts 模型。并且为任意排序创建了字段Order = models.PositiveIntegerField()

class Post(models.Model):
    title = models.CharField(max_length=15)
    create = models.DateTimeField(auto_now_add=True)
    Order = models.PositiveIntegerField()

目标: 在模型中,覆盖save 方法,在添加每个新的Post 时,将索引+1(从帖子的最后一个可用索引)添加到此字段。

也就是说,每个帖子都必须有一个Order-index,如果站点上已经有3个帖子,那么当添加第四个时-索引4被添加到他的字段中,以此类推。

订单字段中的“1”索引(第 1 篇文章),订单字段中的“2”索引(第 2 篇文章)等 3、4、5...类似的 ID。

帮助实现这个逻辑im方法save。看起来很简单,但我不知道如何处理。

我了解在模型中以及我所做的事情:

def save(self, *args, **kwargs):
    qs = self.order.objects.all()
    last_item = qs.latest(self.order)
    last_item.order += 1
    super().save(*args, **kwargs)

但这不起作用。请帮帮我!

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    可能是这样的:

    def save(self, *args, **kwargs):
        model_class = type(self)
        last_item = model_class.objects.order_by('-order').first()
        if last_item is not None:
            self.order = last_item.order + 1
    
        super().save(*args, **kwargs)
    

    您获得类 (model_class),然后按 order 字段降序排序并获得第一个实例。

    我建议你为order字段添加一个索引,如果你还没有的话,因为每次创建新实例时都会查询这个字段。如果没有索引,性能可能会受到影响,特别是在有很多行的情况下。

    【讨论】:

    • 谢谢,可以了,但是 - return super(Post, self).save(*args, **kwargs)
    • @Elliot13 save() 方法不返回任何内容,因此无需使用return; return 语句不会产生问题,但不是必须的。
    • @Elliot13 和 super() 可以不带参数使用,如果你的类结构像这样简单;如果您传递参数super(Post, self),它可以工作,但没有它们也可以工作
    • 是的,你是对的!谢谢! @Ralf
    • 为什么model_class = type(self) model_class.objects.order_by('-order').first() 不只是Post.objects.order_by('-order').first() ???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多