我正在使用带有“through”类的ManyToManyField,这会在获取事物列表时导致大量查询。我想知道是否有更有效的方法。
例如,这里有一些简化的类描述书籍及其多个作者,这些作者通过一个角色类(用于定义“编辑”,“插图画家”等角色):
如果我调用Book.authors_names(),那么我可以得到一个类似于以下内容的字符串:
John Doe(编辑),Fred Bloggs,Billy Bob(插图)
它运行良好,但它会执行一次查询以获取书籍的角色,然后为每个人执行另一个查询。如果我正在显示书籍列表,则这将累积到大量查询。
有没有更有效率的方法,在单个查询中使用join每本书进行操作?或者使用batch-select之类的东西是唯一的方法?
(对于额外的奖励点...我的编写作者的方式看起来有些笨拙 - 是否有一种更优雅的Python-esque方式?)
例如,这里有一些简化的类描述书籍及其多个作者,这些作者通过一个角色类(用于定义“编辑”,“插图画家”等角色):
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(),那么我可以得到一个类似于以下内容的字符串:
John Doe(编辑),Fred Bloggs,Billy Bob(插图)
它运行良好,但它会执行一次查询以获取书籍的角色,然后为每个人执行另一个查询。如果我正在显示书籍列表,则这将累积到大量查询。
有没有更有效率的方法,在单个查询中使用join每本书进行操作?或者使用batch-select之类的东西是唯一的方法?
(对于额外的奖励点...我的编写作者的方式看起来有些笨拙 - 是否有一种更优雅的Python-esque方式?)