Tôi muốn đảm bảo một đối tượng là duy nhất và để ném lỗi khi người dùng cố gắng lưu nó (ví dụ: thông qua quản trị viên) nếu không? Theo duy nhất, tôi có nghĩa là một số thuộc tính của đối tượng có thể giữ các giá trị giống như các đối tượng khác, nhưng chúng không thể TẤT CẢ giống hệt với các giá trị của đối tượng khác.DRY đối tượng duy nhất trong Django
Nếu tôi không nhầm, tôi có thể làm điều này như sau:
class Animal(models.Model):
common_name = models.CharField(max_length=150)
latin_name = models.CharField(max_length=150)
class Meta:
unique_together = ("common_name", "latin_name")
Nhưng sau đó mỗi khi tôi cấu trúc lại mô hình (ví dụ như để thêm một lĩnh vực mới, hoặc để thay đổi tên của một lĩnh vực đang tồn tại), Tôi cũng phải chỉnh sửa danh sách các trường trong dấu ngoặc đơn được gán cho unique_together. Với một mô hình đơn giản, đó là OK, nhưng với một mô hình đáng kể, nó trở thành một rắc rối thực sự trong quá trình tái cấu trúc.
Làm cách nào để tránh phải lặp lại việc nhập danh sách tên trường trong dấu ngoặc đơn unique_together? Có cách nào để chuyển danh sách các trường của mô hình đến một biến và gán biến đó cho unique_together thay thế không?
+1 - tuyệt vời câu hỏi. Tôi không nghĩ rằng bạn có thể, nhưng tôi quan tâm để nghe ý kiến của người khác. –
+1 - Nó thực sự là thú vị nếu ai đó có thể tìm thấy một giải pháp tốt đẹp. Tôi đã thử nhưng không thể làm cho nó hoạt động thông qua sự phản chiếu, bởi vì bạn không thể đọc các thuộc tính từ lớp Animal (điều này là hiển nhiên bởi vì Animal không được định nghĩa hoàn toàn tại thời điểm đó). – FlorianH
jtiai trên irc: //irc.freenode.net/django vui lòng dành thời gian để thảo luận câu hỏi và đề nghị tôi có thể thêm lớp "AllUniqueModel" của riêng mình, kế thừa tiêu chuẩn "Mô hình" và tạo một số phép thuật metaclass để tiêm tất cả các trường trong unique_togerther sau khi chúng được xử lý theo quy trình tạo tiêu chuẩn. ' Tôi không hoàn toàn chắc chắn những gì jtiai có nghĩa là do đó, nhưng nó có vẻ giống như một giải pháp phức tạp hơn tôi đã hy vọng. – sampablokuper