JOOHUUN
django | select_related() 본문
select_related
구하려는 객체가 역참조하는 single object(one-to-one or many-to-one)이거나, 또는 정참조 foreign key 일 때 사용한다.
class City(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Person(models.Model):
# ...
hometown = models.ForeignKey(
City,
on_delete=models.SET_NULL,
blank=True,
null=True,
)
def __str__(self):
return self.hometown.name
class Book(models.Model):
# ...
author = models.ForeignKey(Person, on_delete=models.CASCADE)
def __str__(self):
return self.author.hometown.name
1. 일반적인 조희
In [2]: Book.objects.get(id=2)
Out[2]: <Book: 책2>
In [3]: Book.objects.get(id=2).author
Out[3]: <Person: 테스트2>
2. select_related 조회
In [4]: Book.objects.select_related('author').get(id=2)
Out[4]: <Book: 책2>
In [5]: Book.objects.select_related('author').get(id=2).author
Out[5]: <Person: 테스트2>
3. select_related와 filter의 순서는 상관 없다.
In [9]: Book.objects.select_related('author').filter(id=3)
Out[9]: <QuerySet [<Book: 책3>]>
In [11]: Book.objects.filter(id=3).select_related('author')
Out[11]: <QuerySet [<Book: 책3>]>
4. 불필요한 호출을 줄인다.
# select_realted 사용 할 경우
In [12]: b = Book.objects.select_related('author__hometown').get(id=1)
In [13]: p = b.author # Doesn't hit the database.
In [14]: c = p.hometown # Doesn't hit the database.
# select_realted 사용 하지 않는 경우
In [15]: b = Book.objects.get(id=4) # Hits the database.
In [16]: p = b.author # Hits the database.
In [17]: c = p.hometown # Hits the database.
'Django' 카테고리의 다른 글
django | Query 최적화 (0) | 2022.08.16 |
---|---|
django | prefetch_related() (0) | 2022.08.13 |
django Chennels 활용 Websocket 통신 # 3 (consumers.py) (0) | 2022.07.17 |
django Chennels 활용 Websocket 통신 # 2 (모델 작성) (0) | 2022.07.17 |
django Chennels 활용 Websocket 통신 # 1 (세팅 및 테스트) (0) | 2022.07.16 |
Comments