如何设置Django中最高值的排序字段+1的默认值

时间:2012-08-26 09:00:02

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

先谢谢。 我在Django中创建了一个模型,它有一个标题,url和一个Ordering Field。现在我已将该订购字段的默认值设置为ZERO。我的要求是这个defult值应该改为current highest Ordering number + 1。 我可以在Admin Inteface中这样做吗?

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)

2 个答案:

答案 0 :(得分:3)

受到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)

这会在文本框中粘贴新的最大订单值,并使该字段保持可编辑状态。

<强> --- !!编辑!! ---

这会在重置数据库时引发一个问题,因为没有对象可以计算最大值。修复是计算所有找到的对象,如果不存在,则将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)

答案 1 :(得分:2)

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建议覆盖保存方法时。

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

编辑:

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

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

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