先谢谢。
我在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)
答案 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
可以使用值 或可调用 (换言之,方法)。每次渲染字段时,都会调用该方法。
您可以使用它来确保始终通过提供默认方法来计算默认值。