[英]Django 1.8 - How to pre-populate a Model's field based on values in that Model's QuerySet
所以我有一個簡單的Model類
型號
class Item(models.Model):
number = models.IntegerField(default=0)
description = models.CharField(max_length=200)
在管理員中創建新項目后,我希望預先填寫數字字段。
我需要預先填充一個整數,該整數由使用QuerySet返回的最后一個對象確定,該對象返回: Item.objects.order_by('number')
例如 如果我所有商品中的最高商品數是24,我希望通過管理員創建的下一個商品的默認商品數是25。
我知道這是一個相當普遍的問題,並且有許多密切相關的問題,但是對於這種特定情況,我很難找到明確的答案。
我是Django的新手,所以請不要在這里假設任何知識。
提前致謝。
您可以將callable用作默認值 。 在您的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
雖然不確定哪一個更快。
嘗試此操作,您可以創建一個自定義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)
可能的https://github.com/jpwatts/django-positions應用可以幫助您解決問題嗎?
該模塊提供PositionField,這是Django的模型字段,它允許按用戶指定的位置對模型的實例進行排序。 從概念上講,該字段的作用類似於列表索引:當一項的位置更改時,集合中其他項的位置也會隨之更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.