'Through'클래스를 사용하여 ManyToManyField를 사용하고 있습니다. 결과 목록을 가져올 때 많은 쿼리가 발생합니다. 더 효율적인 방법이 있는지 궁금합니다. 예를 들어Django ManyToMany 'through'쿼리를보다 효율적으로 만들려면 어떻게해야합니까?
여기에 역할 클래스를 통해가는 책과 여러 저자를 설명하는 몇 가지 간단한 클래스입니다 ("편집기", "일러스트 레이터"등과 같은 역할을 정의하기 위해) :
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는() 나는이 같은 문자열 뭔가 얻을 수 있습니다 :
홍길동 (편집자), 프레드 Bloggs에, 빌리 밥 (일러스트 레이터)
잘 작동하지만 책에 대한 역할을 얻는 쿼리 하나를 실행 한 다음 모든 사람에 대해 다른 쿼리를 수행합니다. 도서 목록이 표시되면 많은 검색어가 추가됩니다.
더 간단하게 책 하나당 하나의 조인으로이 작업을 수행 할 수 있습니까? 또는 batch-select과 같은 것을 사용하는 유일한 방법입니까?
은 (보너스 포인트 ... authors_names의 내 코딩은() 약간 투박한 외모 - 좀 더 우아하게 파이썬 - 억양 만들 수있는 방법이)
'파이썬 - 억양'보통 몬티 파이썬의 비교를 위해 예약되어 있습니다 : 당신이 찾고있는 단어는 '파이썬'입니다. –
@daniel : 'python-esque'의 사용법은 저자가 코드를 좀 더 재미있게 만들려고 노력하고 있음에도 불구하고 'pythonic'을 올바르게 사용하기 위해 +1 ... –
고마워. 그러나 지금부터는 내 코드를 정확하고 재미있게 만들려고 노력할 것입니다. –