【问题标题】:How to set default value of an ordering field +1 of the highest value in Django如何在Django中设置最大值的排序字段+1的默认值
【发布时间】:2012-08-21 04:00:04
【问题描述】:

提前致谢。 我在 Django 中创建了一个模型,其中有一个标题、url 和一个排序字段。现在我将该排序字段的默认值设置为 ZERO 。我的要求是这个默认值应该更改为current highest Ordering number + 1。 我可以在管理界面中这样做吗?

class FooterLinks(models.Model):
    title = models.CharField(_("Title"), max_length=200, null = True, blank = True)
    link = models.CharField(_("Link"), max_length = 200)
    order = models.IntegerField(_("Sort Order"), default=0)

【问题讨论】:

  • 你说的是AutoField
  • @很快我们可以将 AutoField 用于此类用途吗?它们被用作主键,对吧?我的意思是具有自动递增功能的不同字段,但可编辑且不应该是唯一字段

标签: django django-models django-forms django-admin


【解决方案1】:
from django.db.models import Max
new_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1
FooterLinks.objects.filter(order=0).update(order=new_default)

要使更改永久生效,请使用 South 进行数据库迁移;或者按照 danihp 的建议覆盖 save 方法。

但是请注意,如果您的表变得非常大,最好将此逻辑实现为数据库上的触发器。

编辑:

不,您会运行一次,它会更新数据库中的所有条目 - 理想情况下,您应该在正常的系统停机/维护窗口期间执行此操作。

要调整文本框中的值,您需要更新您在模型中给出的默认值。请注意,default 可以采用值或可调用(换句话说,方法)。每次渲染该字段时都会调用该方法。

您可以使用它来确保始终通过提供一个方法作为默认值来计算默认值。

【讨论】:

  • 这只有在保存条目后才会起作用,对吧?在管理面板中添加新条目时,我需要在文本框中添加增量值吗?我该怎么做?
【解决方案2】:

受 Burhan 回答的启发,我能够解决我的一个问题,类似于你的问题。

所以对于您的问题:在我的 models.py 中创建可调用的 get_new_default

from django.db.models import Max

def get_new_default():
    new_order_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1
    return new_order_default

class FooterLinks(models.Model):
    order = models.CharField(_("Sort Order"), default = get_new_default)

这会将新的最大订单值粘贴到文本框中并保持该字段可编辑。


---!!编辑!!!---

这会引发一个问题,在重置数据库时,因为没有对象可以计算最大值。解决方法是计算所有找到的对象,如果不存在,则默认设置为 1:

from django.db.models import Max

    def get_new_default():
        if FooterLinks.objects.all().count() == 0:
            new_order_default = 1
        else:
            new_order_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1
        return new_order_default

    class FooterLinks(models.Model):
        order = models.CharField(_("Sort Order"), default = get_new_default)

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 2016-12-03
    • 2013-12-29
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多