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.
Cảm ơn để chia sẻ giải pháp của bạn. – Giacomo
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? –
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? –