2012-08-26 39 views
6

Cảm ơn bạn đã Advance. Tôi đã tạo một mô hình ở Django, trong đó nó có tiêu đề, url và Trường đặt hàng. Bây giờ tôi đã đặt giá trị mặc định của Trường Đặt hàng đó là ZERO. Yêu cầu của tôi là giá trị khuyết tật này phải được thay đổi thành current highest Ordering number + 1. Tôi có thể làm điều đó trong Admin Inteface?Cách đặt giá trị mặc định của trường đặt hàng +1 của giá trị cao nhất trong Django

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) 
+0

Bạn đang nói về [AutoField] (https://docs.djangoproject.com/en/1.4/ref/ model/fields/# autofield)? – soon

+0

@soon chúng ta có thể sử dụng AutoField cho các loại Mục đích này không? Chúng được sử dụng làm khóa chính, phải không? Tôi có nghĩa là một lĩnh vực khác với autoincrementing, nhưng có thể chỉnh sửa và không nên là một lĩnh vực duy nhất –

Trả lời

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) 

Để thực hiện các thay đổi vĩnh viễn, hoặc làm một sự chuyển đổi cơ sở dữ liệu với Nam; hoặc như danihp đề nghị ghi đè phương pháp lưu.

Tuy nhiên lưu ý rằng nếu bảng của bạn trở nên rất lớn, sẽ tốt hơn nếu triển khai logic này làm trình kích hoạt trên cơ sở dữ liệu của bạn.

Edit:

Không, bạn sẽ chạy một lần này và nó sẽ cập nhật tất cả các mục trong cơ sở dữ liệu của bạn - lý tưởng bạn sẽ làm điều này trong cửa sổ hệ thống thời gian chết/bảo trì bình thường.

Để điều chỉnh giá trị trong hộp văn bản, bạn cần cập nhật mặc định mà bạn đã đưa ra trong mô hình của mình. Lưu ý rằng default có thể có giá trị hoặc có thể gọi (nói cách khác là phương pháp). Mỗi khi trường được kết xuất, phương thức sẽ được gọi.

Bạn có thể sử dụng điều này để đảm bảo mặc định luôn được tính bằng cách cung cấp phương thức làm mặc định.

+0

này sẽ chỉ hoạt động sau khi lưu một mục, phải không? Tôi cần một giá trị tăng lên trong Hộp văn bản trong khi thêm mục nhập mới trong Bảng điều khiển quản trị? Làm thế nào tôi có thể làm điều đó? –

2

Lấy cảm hứng từ câu trả lời của Burhan, tôi đã có thể giải quyết vấn đề của tôi, tương tự như vấn đề của bạn.

Vì vậy, đối với vấn đề của bạn: Trong models.py tôi tạo callable 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) 

này sẽ dán giá trị đơn hàng tối đa mới vào hộp văn bản và giữ lĩnh vực này có thể chỉnh sửa.


--- !! Chỉnh sửa !! ---

Điều này đặt ra một vấn đề, khi đặt lại cơ sở dữ liệu, vì không có đối tượng nào để tính giá trị tối đa. Sửa chữa là đếm tất cả các đối tượng tìm thấy và trong trường hợp không tồn tại được đặt mặc định là 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) 

Các vấn đề liên quan