2012-08-26 37 views
6

在此先感谢。 我在Django中创建了一个模型,其中有一个标题,url和一个Ordering字段。现在我已将该订购字段的默认值设置为ZERO。我的要求是这个瑕疵值应该更改为current highest Ordering number + 1。 何可以在Admin Inteface中做到这一点?如何在Django中设置排序字段+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) 
+0

你在谈论[下拉列表AutoField](https://docs.djangoproject.com/en/1.4/ref/车型/场/#自动字段)? – soon

+0

@soon我们可以使用AutoField来达到这种目的吗?它们被用作主键,对吧?我的意思是与自动增量不同的领域,但可编辑,不应该是一个独特的领域 –

回答

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) 

要进行更改永久,无论是做南方数据库迁移;或者由于danihp建议覆盖保存方法。

但是请注意,如果你的表格变得非常大,那么将这个逻辑作为数据库触发器会更好。

编辑:

不,你会跑这一次,它会更新所有的条目在数据库 - 最好你会在正常的系统停机/维护窗口做到这一点。

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

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

+0

这只会在保存一个条目后才工作,对吧? 我需要在文本框中添加值,同时在管理面板中添加新条目?我怎样才能做到这一点? –

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) 

相关问题