2011-10-05 71 views
2

我的問題類似於this,但在此特定情況下創建聯結表並不好。在Django中使用抽象類從多對多檢索對象

模型的一小段:

class Item(models.Model): 
    photos = models.ManyToManyField('Photo', blank=True, null=True, related_name='photo_in_%(class)ss') 

    class Meta: 
     abstract = True 

然後我就許多類是這樣的:

class Article(Item): pass 
class BlogEntry(Item): pass 
class Country(Item): pass 
... 

,當然還有:

class Photo(models.Model): 
    pass 

有例如a = Article()我可以很容易地得到文章中的照片與a.photos.all()

問題是:有p = Photo()如何檢索所有對象與此照片?

但是:

通用的關係是不是一種選擇。每張照片可以同時處於各種項目的照片中。

雖然我想出了這樣的方法。但它使用eval和EVAL是邪惡 ...

class Photo(models.Model): 
    def get_items_with_photo(self): 
     items = [] 
     for cl in [name for name in dir(self) if name.startswith('photo_in')]: 
      qset = eval('self.%s.all()' % (cl)) 
      [items.append(item) for item in qset] 
     return items 

我將不勝感激任何不同的(更好的)解決方案。

回答

0

相反的:

qset = eval('self.%s.all()' % (cl)) 

做:

photo_attr = getattr(self, cl) 
qset = photo_attr.all() 
+0

謝謝 - 偉大工程!我認爲沒有類似Django的方法來做這樣的事情? – laszchamachla

+0

爲什麼在Python方法已經工作時有類似Django的方法?沒有必要重新發明輪子。如果它運作良好,你應該接受答案! – Etienne

+0

只是因爲在建模和處理Django的ORM時,並不是每個Python方法都能很好地工作。我知道我應該接受你的答案 - 但是什麼是快點;)? – laszchamachla