簡體   English   中英

Django 1.8-如何根據該模型的QuerySet中的值預填充模型的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM