πŸ”— Как ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Django: Π»ΡƒΡ‡ΡˆΠΈΠ΅ способы ΠΈ совСты

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Django, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ForeignKey ΠΈΠ»ΠΈ ManyToManyField.

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ "ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ" ΠΌΠ΅ΠΆΠ΄Ρƒ двумя модСлями, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ ForeignKey. НапримСр:


class ΠœΠΎΠ΄Π΅Π»ΡŒΠ ΠΎΠ΄ΠΈΡ‚Π΅Π»Ρ(models.Model):
    ΠΏΠΎΠ»Π΅ = models.CharField(max_length=50)

class МодСльРСбСнка(models.Model):
    Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ = models.ForeignKey(ΠœΠΎΠ΄Π΅Π»ΡŒΠ ΠΎΠ΄ΠΈΡ‚Π΅Π»Ρ, on_delete=models.CASCADE)
    ΠΏΠΎΠ»Π΅ = models.CharField(max_length=50)

Если вашСй Ρ†Π΅Π»ΡŒΡŽ являСтся созданиС ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ "ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ" ΠΌΠ΅ΠΆΠ΄Ρƒ двумя модСлями, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ ManyToManyField. НапримСр:


class МодСль1(models.Model):
    ΠΏΠΎΠ»Π΅ = models.CharField(max_length=50)

class МодСль2(models.Model):
    ΠΏΠΎΠ»Π΅ = models.CharField(max_length=50)
    модСль_1 = models.ManyToManyField(МодСль1)

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ послС создания ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ модСлями.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Django?

ОбъСдинСниС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² Django - это процСсс соСдинСния Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ вмСстС. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ связи ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ модСлями ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ слоТныС запросы ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ нСсколько ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.

1. Бвязи ΠΌΠ΅ΠΆΠ΄Ρƒ модСлями

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ способ объСдинСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ - использованиС связСй ΠΌΠ΅ΠΆΠ΄Ρƒ модСлями. Π’ Django сущСствуСт нСсколько Ρ‚ΠΈΠΏΠΎΠ² связСй, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ForeignKey, ManyToManyField ΠΈ OneToOneField, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для создания связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ модСлями.

НапримСр, допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Author ΠΈ Book. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ внСшний ΠΊΠ»ΡŽΡ‡ author Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Book, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ:


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 = Author.objects.get(id=1)
books = author.book_set.all()
    

2. ОбъСдинСниС запросов ΠΊ модСлям

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ объСдинСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ - это объСдинСниС запросов ΠΊ модСлям с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° select_related ΠΈΠ»ΠΈ prefetch_related. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ связанныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π·Π° ΠΎΠ΄ΠΈΠ½ запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ N+1.

НапримСр, допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Author ΠΈ Book, ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ всСх Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² вмСстС с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΈΡ… ΠΊΠ½ΠΈΠ³Π°Ρ…. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


authors = Author.objects.select_related('book').all()
    
for author in authors:
    print(author.name)
    
    for book in author.book_set.all():
        print(book.title)
    

3. ИспользованиС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

Π’Ρ€Π΅Ρ‚ΠΈΠΉ способ объСдинСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ - это использованиС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для выполнСния слоТных запросов ΠΊ модСлям.

НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΌΠΎΠ΄Π΅Π»ΠΈ AuthorManager, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΌΠ΅Ρ‚ΠΎΠ΄ get_authors_with_books, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всСх Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² вмСстС с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΈΡ… ΠΊΠ½ΠΈΠ³Π°Ρ…:


class AuthorManager(models.Manager):
    def get_authors_with_books(self):
        return self.select_related('book').all()
        
class Author(models.Model):
    name = models.CharField(max_length=100)
    objects = AuthorManager()

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΌΠΎΠ΄Π΅Π»ΠΈ для получСния всСх Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² вмСстС с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΈΡ… ΠΊΠ½ΠΈΠ³Π°Ρ…:


authors = Author.objects.get_authors_with_books()
    
for author in authors:
    print(author.name)
    
    for book in author.book_set.all():
        print(book.title)
    

4. ИспользованиС ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ запросов

Π§Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ способ объСдинСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ - это использованиС ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ запросов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Q. ΠœΠ΅Ρ‚ΠΎΠ΄ Q позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ для поиска ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ условиям.

НапримСр, допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Author ΠΈ Book, ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ всСх Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΊΠ½ΠΈΠ³Π° с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


from django.db.models import Q

authors = Author.objects.filter(
    Q(book__title='НазваниС книги 1') | Q(book__title='НазваниС книги 2')
)
    
for author in authors:
    print(author.name)
    

5. ИспользованиС Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΉ

ΠŸΡΡ‚Ρ‹ΠΉ способ объСдинСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ - это использованиС Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΉ для выполнСния слоТных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ связанными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Django ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Count, Sum, Avg, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ подсчСта, суммирования ΠΈ срСднСго значСния.

НапримСр, допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Author ΠΈ Book, ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство ΠΊΠ½ΠΈΠ³ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΡ€Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


from django.db.models import Count

authors = Author.objects.annotate(num_books=Count('book'))
    
for author in authors:
    print(author.name, author.num_books)
    

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ОбъСдинСниС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² Django ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достигнуто с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ связСй ΠΌΠ΅ΠΆΠ΄Ρƒ модСлями, объСдинСния запросов ΠΊ модСлям, использования ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ запросов ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΉ. Π’Ρ‹Π±ΠΎΡ€ подходящСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π° зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ для объСдинСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² Django ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡŒΡ‚Π΅ свои возмоТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

ΠšΡƒΡ€Ρ 13. Π’ΠΈΠ΄Ρ‹ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Django. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΡƒΡŽ модСль.+ Django ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°.

56 Бвязи ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ. Нормализация Π‘Π”. ΠšΡƒΡ€Ρ ΠΏΠΎ Django

#9. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ связСй ΠΌΠ΅ΠΆΠ΄Ρƒ модСлями Ρ‡Π΅Ρ€Π΅Π· класс ForeignKey | Django ΡƒΡ€ΠΎΠΊΠΈ

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

πŸ”ΠšΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ jsonfield Π² Django: практичСскоС Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎπŸ“š

πŸ”— Как ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Django: Π»ΡƒΡ‡ΡˆΠΈΠ΅ способы ΠΈ совСты