2011-01-14 44 views
7

Chức năng ForeignRelatedObjectsDescriptor.create_manager(...) của Django sẽ tự động tạo các lớp RelatedManager và sau đó khởi tạo một thể hiện của lớp được tạo động.Ghi đè các phương thức liên quan của Django

Nếu tôi muốn ghi đè phương pháp RelatedManager.add(...), tôi sẽ làm như thế nào?

Lớp học RelatedManager được tạo trong tệp: django/db/models/fields/related.py.

Một ví dụ về làm thế nào tôi muốn sử dụng một tùy chỉnh RelatedManager là ...

class Record(Model): 
    string = CharField() 
class Managed(Model): 
    record = ForeignKey('Record') 
    boolean = BooleanField() 
def view_function(...): 
    record = Record(string='Example') 
    record.save() 
    record.managed_set.add(Managed(boolean=True)) # How to override add()? 

Bất kỳ đề xuất sẽ được đánh giá cao.

Trả lời

3

Tôi không chắc chắn những gì bạn cần ghi đè - bộ truy vấn mặc định đã làm những gì bạn muốn.

Nhưng để trả lời câu hỏi, bạn có thể xác định Trình quản lý tùy chỉnh trên mô hình và đặt use_for_related_fields=True để đảm bảo nó được sử dụng làm trình quản lý tự động. Xem tài liệu trên controlling automatic Manager types.

+0

người đàn ông, bạn là đạo diễn django của tôi làm tròn những phần này, bạn biết mọi thứ –

+4

Điều này không hiệu quả. Tạo một Trình quản lý tùy chỉnh để đặt use_for_related_fields = True đảm bảo rằng lớp cha của Trình quản lý tùy chỉnh là Trình quản lý tùy chỉnh. Tuy nhiên, lớp ContactManager được định nghĩa động trong tệp được chỉ định trong câu hỏi của tôi và bất kỳ add() nào trong Trình quản lý tùy chỉnh bị ghi đè bởi định nghĩa động của Trình quản lý liên quan. Tôi có thể sửa đổi của addMan thêm() và thêm self.pre_save() và self.post_save() móc để được thực hiện trong quản lý tùy chỉnh và sau đó gửi một bản vá cho Django, nhưng tôi tự hỏi nếu có một cách tốt hơn tôi không nhận thức được. – brildum

+1

-1 vì nó không hoạt động, '_related_' trong biến đó chỉ là phần lịch sử và không liên quan gì đến người quản lý của các trường liên quan. – Evgeny

0

Tôi nghĩ rằng tôi đang gặp vấn đề tương tự.

Tôi có trình quản lý tùy chỉnh ghi đè self._dbget_query_set() để định tuyến đến cơ sở dữ liệu khác.

Tôi đã tạo động một lớp mô hình và có số _default_manager được thiết lập với trình quản lý tùy chỉnh của tôi.

Điều này làm việc cho chính lớp đó, nhưng không phải cho trường liên quan (ngoại quốc hoặc nhiều2many), mặc dù tôi đã đặt bộ use_for_related_fields = True.

Đối với lĩnh vực liên quan, phụ db_manager(dbname) (ví dụ, record.managed_set.db_manager(dbname)) có thể sửa chữa tất cả() phương pháp, nhưng không phải cho add() phương pháp.

Để hiểu tôi muốn nói gì, xem vé django này: http://code.djangoproject.com/ticket/13358

Tôi nghĩ rằng nó hoạt động cho all(), nhưng không add().

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