2009-02-07 29 views
19

Tôi hiện đang mã hóa một trang web ở Django (vì bạn không bao giờ có thể học quá nhiều khung!) Và tôi tự hỏi liệu có cách nào để tự động tăng một đối tượng liên quan đến một đối tượng liên quan hay không. Vì vậy, ví dụ, nói rằng tôi có một mô hình nhập cảnh và mô hình EntryVersion:Có cách nào để tự động tăng trường Django đối với khóa ngoại không?

nhập
- tiêu đề
- sên

EntryVersion
- nhập cảnh (khoá ngoại)
- VERSION_NUMBER
- nội dung

Tôi muốn tự động gia tăng version_number đối với khóa ngoại nhập (để một mục nhập có thể có nhiều phiên bản, bắt đầu từ một và di chuyển lên trên bằng một). Mặc dù vậy, nó sẽ không phải là một sự tăng tự động thực sự, bởi vì nó sẽ không phải là duy nhất trong cơ sở dữ liệu (có thể có nhiều phiên bản nhập với version_number = 1; chỉ một cho một Entry nhất định).

Tôi biết rằng tôi có thể cuộn quản trị viên của riêng mình và chỉ xử lý ở đó, nhưng đã tự hỏi liệu có bất kỳ cách nào để quản trị viên Django tự động tăng số phiên bản hay không mỗi khi một phiên bản mới được lưu.


Chỉnh sửa: mã cụ thể mà tôi được sử dụng (điều chỉnh để chỉ thiết lập số phiên bản trên đầu lưu)

câu trả lời Tiago là đúng, nhưng vì lợi ích của người sử dụng StackOverflow tương lai với tình huống khó xử tương tự, đây là mã cụ thể mà tôi đã sử dụng:

def save(self, force_insert=False, force_update=False): 
    # Only modify number if creating for the first time (is default 0) 
    if self.version_number == 0: 
     # Grab the highest current index (if it exists) 
     try: 
      recent = EntryVersion.objects.filter(entry__exact=self.entry).order_by('-version_number')[0] 
      self.version_number = recent.version_number + 1 
     except IndexError: 
      self.version_number = 1 
    # Call the "real" save() method 
    super(EntryVersion, self).save(force_insert, force_update) 

các order_by w/index Bí quyết là một tôi lượm lặt từ các tài liệu Django đây:

http://docs.djangoproject.com/en/dev/topics/db/queries/#id4

Lưu ý rằng bạn phải có default=0 định nghĩa trên sân version_number của bạn để làm việc này.

Có thể có cách tốt hơn, nhưng điều này dường như đang hoạt động chính xác theo cách tôi cần; hy vọng những người khác cũng sẽ thấy nó hữu ích.

+0

Cảm ơn để chia sẻ giải pháp của bạn. – Giacomo

+1

Giải pháp này an toàn đến mức nào, với các yêu cầu đồng thời cho cùng một mục nhập? –

+0

Tôi không chắc chắn tôi 100% grok trường hợp sử dụng của bạn. Bạn có thể làm điều này trong phương thức save của Entry không? –

Trả lời

8

Bạn có thể làm điều này:

def save(self, force_insert=False, force_update=False): 
    #if self.id is None: 
    self.version_number += 1 

    super(EntryVersion, self).save(force_insert, force_update) # Call the "real" save() method. 

mà đến trực tiếp từ đây:

http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

+0

Cảm ơn! Rõ ràng tôi sẽ cần phải thêm một chút logic hơn là chỉ tăng số version_number (vì nó có lẽ sẽ không mặc định cho số phiên bản cuối cùng), nhưng tôi nghĩ đó chắc chắn là hướng tôi cần phải đi vào; cảm ơn cũng cho các liên kết, tôi đã không nhận thấy rằng trong các tài liệu. –

+0

Tôi đã làm một cái gì đó như thế này trong một dự án, nhưng cuối cùng tôi đã đặt logic bên trong khung nhìn, vì điều đó đơn giản hơn và chỉ có một phương pháp có thể tạo đối tượng của tôi. – Tiago

+0

Tôi có thể sẽ chuyển sang chế độ xem, nhưng tôi đặc biệt muốn có thể thực hiện công việc này ngay bây giờ (vì tôi đang ở giai đoạn thử nghiệm rất sớm và chưa có bất kỳ thiết lập chế độ xem chỉnh sửa nào). Cảm ơn một lần nữa! –

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