Django-да көптен-көпке қатынасты қалай жүзеге асыруға болады?
AI-дан жауап
sobes.tech AI
Django-да "көпке-көп" қатынасы "ManyToManyField" өрісі арқылы жүзеге асырылады. Бұл өріс екі модельді байланыстырып, дерекқорда байланыстарды сақтау үшін аралық кесте құрады.
Мысалы, бізде Author және Book модельдері бар делік. Бір кітап бірнеше авторлармен жазылуы мүмкін, ал бір автор бірнеше кітап жаза алады.
# models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author) # ManyToManyField өрісі
def __str__(self):
return self.title
Book моделіне ManyToManyField қосқанда, Django автоматты түрде аралық кесте (әдетте appname_book_authors деп аталады) құрады, ол Book пен Author-ды байланыстырады. Бұл кестеде екі модельдің сыртқы кілттері үшін бағандар болады (book_id және author_id).
Осы қатынаспен жұмыс істеу үшін келесі синтаксис қолданылуы мүмкін:
Авторларды кітапқа қосу:
# Мысал қолдану
from myapp.models import Author, Book
author1 = Author.objects.create(name="Лев Толстой")
author2 = Author.objects.create(name="Федор Достоевский")
book = Book.objects.create(title="Соғыс және бейбітшілік")
book.authors.add(author1)
book.authors.add(author2) # Авторларды кітапқа қосу
Автордың барлық кітаптарын алу:
author = Author.objects.get(name="Лев Толстой")
books_by_tolstoy = author.book_set.all() # Қарама-қарсы қатынас
# Қарама-қарсы қатынас әдепкі бойынша "_set" арқылы қол жетімді
# Қарама-қарсы қатынастың атын related_name арқылы өзгертуге болады
Кітаптың барлық авторларын алу:
book = Book.objects.get(title="Соғыс және бейбітшілік")
authors_of_book = book.authors.all() # Байланысқан авторларға қол жеткізу
Авторларды кітаптан жою:
book = Book.objects.get(title="Соғыс және бейбітшілік")
author1 = Author.objects.get(name="Лев Толстой")
book.authors.remove(author1) # Авторды кітаптан жою
Кітаптың барлық авторларын тазалау:
book = Book.objects.get(title="Соғыс және бейбітшілік")
book.authors.clear() # Барлық авторларды жою
Бірнеше авторды бір уақытта қосу:
book = Book.objects.get(title="Соғыс және бейбітшілік")
author3 = Author.objects.create(name="Михаил Булгаков")
author4 = Author.objects.create(name="Антон Чехов")
book.authors.add(author3, author4) # Бірнеше авторды қосу
Қосымша мүмкіндіктер:
-
through: Егер қосымша өрістерді қосу қажет болса,throughпараметрі арқылы өзіңіздің аралық моделіңізді анықтауға болады (мысалы, авторды кітапқа қосу күнін сақтау үшін).class Membership(models.Model): book = models.ForeignKey(Book, on_delete=models.CASCADE) author = models.ForeignKey(Author, on_delete=models.CASCADE) date_added = models.DateField() class Book(models.Model): title = models.CharField(max_length=200) authors = models.ManyToManyField(Author, through='Membership') def __str__(self): return self.title -
related_name: Қарама-қарсы қатынастың атын өзгертуге мүмкіндік береді.class Author(models.Model): name = models.CharField(max_length=100) books = models.ManyToManyField('Book', related_name='published_by') # Қарама-қарсы қатынастың атын өзгерту def __str__(self): return self.name # Енді автордың кітаптарын алу үшін: # author = Author.objects.get(name="Лев Толстой") # books_by_author = author.books.all() # Ал кітаптың авторларын алу үшін: # book = Book.objects.get(title="Соғыс және бейбітшілік") # authors_of_book = book.published_by.all()
Осылайша, ManyToManyField Django-да "көпке-көп" қатынастарды басқаруды жеңілдетеді, автоматты түрде сәйкес аралық кестені құрып, оны басқаруға мүмкіндік береді.