Django 1.8 - 如何根据模型的QuerySet

时间:2015-07-08 07:18:16

标签: python django

所以我有一个简单的Model类

Models.py

class Item(models.Model):
    number = models.IntegerField(default=0)
    description = models.CharField(max_length=200)

在管理员中创建新商品后,我希望预先填充数字字段。

我需要预先填充一个整数,该整数由返回的QuerySet找到的最后一个对象确定: Item.objects.order_by(' number')

所以例如;如果我所有项目中的最高数字为24,我希望我通过管理员创建的下一个项目的默认数字为25。

我知道这是一个相当普遍的问题,并且存在许多密切相关的问题,但我很难找到针对这种特定情况的明确答案。

我对Django很新,所以请不要在这里承担任何知识。

提前致谢。

3 个答案:

答案 0 :(得分:3)

您可以使用callable as your default value。在models.py中试试这个:

from django.db.models import Max

def count_numbers():
    max_value = Item.objects.all().aggregate(Max('number'))
    return max_value['number__max'] + 1

class Item(models.Model):
    number = models.IntegerField(default=count_numbers)
    description = models.CharField(max_length=200)

修改

如果您更喜欢使用order_by子句,可以使用:

def count_numbers():
    query = list(Item.objects.order_by('-number')[:1])
    return query[0] + 1 if query else 0

不确定哪一个更快。

答案 1 :(得分:0)

试试这个,您可以创建一个自定义的ModelAdmin并将其注册到管理站点:

from django.contrib import admin
from ..models import Item

class ItemAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # Add custom logic
        largest_item = Item.objects.latest('number')
        obj.number = largest_item.number + 1

        # Delegate default behaviour to superclass
        super(ItemAdmin, self).save_model(request, obj, form, change)

admin.site.register(Item, ItemAdmin)

答案 2 :(得分:0)

可能的https://github.com/jpwatts/django-positions应用可以帮助解决您的问题吗?

  

该模块提供了PositionField,它是Django的模型字段,允许模型实例按用户指定的位置排序。从概念上讲,该字段的工作方式类似于列表索引:当一个项目的位置发生变化时,集合中其他项目的位置会作为响应进行更新。