2011-09-24 39 views
10

Tôi muốn cảnh báo hoặc ngăn chặn người dùng xóa một cá thể đối tượng được gọi bởi các phiên bản khác. Có cách nào tốt đẹp để làm điều này?Django: Làm thế nào tôi có thể tìm thấy mô hình nào của tôi đề cập đến một mô hình

Một cách để có được danh sách các mô hình bao gồm tham chiếu và sau đó thử tra cứu ngược lại trên chúng. Có cách nào để có được danh sách các mô hình đó không? đây có phải là cách tốt hơn không?

Trong khi điều tra đề nghị thu, tôi tìm thấy một số thông tin liên quan và viết những điều sau đây mà tìm thấy các lớp học mà có referent như một chìa khóa nước ngoài:

def find_related(cl, app): 
    """Find all classes which are related to the class cl (in app) by 
    having it as a foreign key.""" 

    from django.db import models 

    all_models = models.get_models() 
    ci_model = models.get_model(app, cl) 
    for a_model in all_models: 
     for f in a_model._meta.fields: 
      if isinstance(f, ForeignKey) and (f.rel.to == ci_model): 
       print a_model.__name__ 

Dựa trên gợi ý để sử dụng các mã trong thu thập:

def find_related(instance): 
"""Find all objects which are related to instance.""" 

for related in instance._meta.get_all_related_objects(): 
    acc_name = related.get_accessor_name() 
    referers = getattr(instance, acc_name).all() 
    if referers: 
     print related 
+0

Cảm ơn bạn đã cập nhật câu hỏi này với giải pháp cuối cùng của mình. Công việc tuyệt vời. – Spike

+0

Bạn có 'find_related' lấy' (cl, app) ', trong khi' get_model' nhận '(app, cl)'. Nó thực sự khó hiểu! Ngoài ra, nếu bất cứ ai khác đang đọc này, 'cl' và' app' là các chuỗi - không vượt qua các đối tượng! – Casebash

Trả lời

3

Django có thứ gọi là Collector lớp. Nó được sử dụng bởi Django khi thực hiện xóa mô hình. Những gì nó có vẻ như chính xác những gì bạn muốn. Bằng cách gọi collect(), nó tìm tất cả các tham chiếu đến đối tượng trong biểu đồ mô hình. Ngoài ra nó cung cấp một cách để xóa tất cả các đối tượng tìm thấy, với một cuộc gọi delete().

Điều đó nói rằng tôi chưa bao giờ sử dụng lớp này bản thân mình, tôi chỉ biết nó tồn tại. API có phần phức tạp, nhưng nếu bạn sẵn sàng đào sâu vào bên trong của Django một chút, nó có thể giúp bạn tiết kiệm rất nhiều mã hóa.

+0

Điều đó có vẻ đầy hứa hẹn nhưng tôi đang sử dụng 1.0 mà chỉ có người tiền nhiệm của Collector - CollectedObjects mà không giống như nó có một phương pháp tương tự. CollectedObjects được sử dụng trong (http://stackoverflow.com/questions/437166/duplicating-model-instances-and-their-related-objects-in-django-algorithm-for-r) để tìm các đối tượng được gọi bởi cá thể bị xóa. – Mitch

+0

Chúng ta có thể giả định rằng (a) có lý do chính đáng mà bạn không thể nâng cấp lên phiên bản mới hơn và (b) tương tự như vậy bạn không thể tự mình sử dụng bộ thu? – Marcin

+0

@Mitch: Vâng, tôi đồng ý với Marcin ở đây, rằng nếu bạn không thể nâng cấp, bạn luôn có thể thực hiện một nỗ lực để sử dụng 'Collector.collect()' thực hiện như là một cơ sở cho mã của riêng bạn. Mã Django nói chung là xa sạch, nhưng sau khi phân tích một số, nó vẫn nên sử dụng được. – julkiewicz

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