所以我有一个简单的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很新,所以请不要在这里承担任何知识。
提前致谢。
答案 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的模型字段,允许模型实例按用户指定的位置排序。从概念上讲,该字段的工作方式类似于列表索引:当一个项目的位置发生变化时,集合中其他项目的位置会作为响应进行更新。