4

提前致谢。我在 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)
4

2 回答 2

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)

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


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

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

于 2016-06-13T22:48:13.330 回答
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 建议的那样覆盖 save 方法。

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

编辑:

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

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

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

于 2012-08-26T09:35:02.440 回答