我正在使用帶有'through'類的ManyToManyField,並且在獲取事物列表時會導致很多查詢。我想知道是否有更有效的方法。如何讓Django ManyToMany'通過'查詢更高效?
例如這裏描述的書籍和他們的幾位作者的一些簡單的類,它經過一個角色類(定義如「編輯器」,「插畫」等角色):
class Person(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
@property
def full_name(self):
return ' '.join([self.first_name, self.last_name,])
class Role(models.Model):
name = models.CharField(max_length=50)
person = models.ForeignKey(Person)
book = models.ForeignKey(Book)
class Book(models.Model):
title = models.CharField(max_length=255)
authors = models.ManyToManyField(Person, through='Role')
@property
def authors_names(self):
names = []
for role in self.role_set.all():
person_name = role.person.full_name
if role.name:
person_name += ' (%s)' % (role.name,)
names.append(person_name)
return ', '.join(names)
如果我打電話Book.authors_names(),那麼我可以得到一個字符串是這樣的:
李四(編者),弗雷德·布洛斯,比利·鮑伯·(插圖)
它工作正常,但它有一個查詢來獲得該書的角色,然後是每個人的另一個查詢。如果我顯示的是書籍列表,則會添加很多查詢。
有沒有辦法更有效地做到這一點,在每一本書的單個查詢,加入?或者是唯一使用像batch-select之類的方法?
(獎勵積分...我authors_names的編碼()看起來有點笨重 - 就是有辦法使它更優雅的Python式的?)
「的Python式的」通常保留給比較,巨蟒:你要找的字是「Python化」。 – 2010-11-23 12:38:11
@daniel:+1正確使用'pythonic',儘管'python-esque'的使用可能意味着作者正在尋求使代碼更有趣...... – 2010-11-23 12:51:10
感謝您的更正。不過,我將從現在起努力使我的代碼不僅更正確,而且更有趣。 – 2010-11-23 13:41:34