2011-09-24 10 views
10

Bir kullanıcının başka örnekler tarafından atıfta bulunulan bir nesne örneğini silmesini önleme veya uyarmak istiyorum. Bunu yapmanın iyi bir yolu var mı?Django: Modellerimin hangi modele başvurduğunu nasıl bulabilirim?

Bir yol, başvuruyu içeren modellerin bir listesini almak ve ardından geriye doğru arama yapmayı deneyin. Bu modellerin listesini almanın bir yolu var mı? Yoksa daha iyi bir yolu var mı?

kolektör öneri araştırırken

, ben bazı ilgili bilgiler buldum ve yabancı anahtar olarak referent sahip sınıflar bulur şunları yazdı: öneri dayanarak

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__ 

toplamak kodu kullanmak:

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

Bu soruyu son çözümünüzle güncellediğiniz için teşekkür ederiz. Harika iş. – Spike

+0

'get_model',' (app, cl) 'yi alırken' find_related' '' (cl, app) 'yi aldınız. Bu gerçekten kafa karıştırıcı! Ayrıca, eğer başka biri bunu okuyorsa, 'cl' ve 'app' dizeleridir - nesneleri geçmeyin! – Casebash

cevap

3

Django, Collector sınıfı adlı bir şeye sahiptir. Bir model silme işlemi gerçekleştirirken Django tarafından kullanılır. Tam olarak ne istediğine benziyor. collect() numaralı telefonu arayarak, model grafiğindeki nesneye yapılan tüm referansları bulur. Ek olarak, bulunan tüm nesneleri delete() çağrısı ile silmenin bir yolunu sunar.

Bu dersi hiç kullanmadım dedim, sadece var olduğunu biliyorum. API biraz kıvrımlıdır, ancak Django'nun içlerine birazcık girmeye istekli olursanız, size çok fazla kodlama yapabilir.

+0

Bu umut verici görünüyor ama ben sadece benzer bir yöntemi var gibi görünmüyor Collector - CollectedObjects selefi olan 1.0 kullanıyorum. CollectedObjects, örnek tarafından belirtilen nesneleri bulmak için kullanılır (http://stackoverflow.com/questions/437166/duplicating-model-instances-and-their-related-objects-in-django-algorithm-for-r) silinmiş – Mitch

+0

(a) Daha yeni bir sürüme yükseltememenizin iyi bir nedeni olduğunu varsayalım ve (b) aynı şekilde toplayıcıyı sadece kendi başınıza kullanamazsınız? – Marcin

+0

@Mitch: Evet, burada Marcin ile aynı fikirdeyim, eğer yükseltme yapamıyorsanız, her zaman kendi kodunuz için 'Collector.collect()' uygulamasını kullanmaya çalışabilirsiniz. Django kodu genel olarak temiz olmaktan uzaktır, ancak bazı analizlerden sonra hala kullanılabilir olmalıdır. – julkiewicz

İlgili konular