# Select Related

```python
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
```

মনে করি আমার ডেটাবেজ এ নিচের মত ডেটা আছে

```
Author Data:
--------------
ID: 1

Name: John Smith

ID: 2

Name: Jane Doe



Book Data:
--------------
ID: 1

Title: "Book 1"

Author: 1 (John Smith)

ID: 2

Title: "Book 2"

Author: 1 (John Smith)

ID: 3

Title: "Book 3"

Author: 2 (Jane Doe)
```

এবার একটি নরমাল কোয়েরি চালিয়ে book মডেল থেকে author এর নাম বের করি।

```
books = Book.objects.all()

for book in books:
    author = book.author  # Retrieves the author for each book (causing an additional query)
    print(f"Book: {book.title}, Author: {author.name}")
```

উপরের কোয়েরি টি চালানোর ফলে প্রথমে সব বুক অবজেক্ট নিয়ে আসবে যার মধ্যে author নাম থাকবে না পরে আরেকটি কোয়েরি চালিয়ে (ফর লুপে চালানো হয়েছে ) ডেটা আনতে হয়েছে তার পর ডেটা এসেছে।

```
<QuerySet [
    <Book: Book 1>,
    <Book: Book 2>,
    <Book: Book 3>
]>

```

এবার releated() কোয়েরি চালাই :

```python
books = Book.objects.select_related('author')

for book in books:
    author = book.author  # No additional query is made because of select_related()
    print(f"Book: {book.title}, Author: {author.name}")
```

উপরের কোয়েরি টি চালানোর ফলে  বুক অবজেক্ট নিয়ে আসবে যার মধ্যে author নাম থাকবে যার কারণে ফর লুপের মধ্যে নতুন কোন কোয়েরি লাগবে না সরাসরি ডেটা প্রদান করবে।

```
<QuerySet [
    <Book: A Tale of Two Cities (Author: John Smith)>,
    <Book: To Kill a Mockingbird (Author: John Smith)>,
    <Book: The Great Gatsby (Author: [Author not loaded])>
]>
```
