Создание запросов¶
После того как вы создали модели данных , Django автоматически предоставляет вам API-интерфейс для базы данных, который позволяет создавать, извлекать, обновлять и удалять объекты. Этот документ объясняет, как использовать этот API. Обратитесь к справочнику по модели данных для получения полной информации обо всех различных параметрах поиска модели.
В этом руководстве (и в справочнике) мы будем ссылаться на следующие модели, из которых состоит приложение для блога:
from datetime import date from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=200) email = models.EmailField() def __str__(self): return self.name class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField(default=date.today) authors = models.ManyToManyField(Author) number_of_comments = models.IntegerField(default=0) number_of_pingbacks = models.IntegerField(default=0) rating = models.IntegerField(default=5) def __str__(self): return self.headline
Создание объектов¶
Для представления данных таблицы базы данных в объектах Python Django использует интуитивно понятную систему: класс модели представляет таблицу базы данных, а экземпляр этого класса представляет конкретную запись в таблице базы данных.
Чтобы создать объект, создайте его экземпляр с помощью аргументов ключевого слова для класса модели, а затем вызовите save() , чтобы сохранить его в базе данных.
Предполагая, что модели находятся в файле mysite/blog/models.py , вот пример:
>>> from blog.models import Blog >>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') >>> b.save()
Выполняется SQL-оператор INSERT за кулисами. Django не обращается в базу данных, пока вы не вызовете явно save() .
Метод save() не имеет возвращаемого значения.
save() использует несколько дополнительных параметров, которые здесь не описаны. Смотрите документацию save() для получения полной информации.
Чтобы создать и сохранить объект за один шаг, используйте метод create() .
Сохранение изменений в объектах¶
Чтобы сохранить изменения в объекте, который уже находится в базе данных, используйте save() .
Для экземпляра Blog b5 , который уже был сохранен в базе данных, этот пример меняет имя и обновляет запись в базе данных:
Здесь выполняется оператор SQL UPDATE . Django не делает запрос в базу данных, пока вы не вызовете явно save() .
Сохранение полей ForeignKey и ManyToManyField ¶
Обновление поля ForeignKey работает точно так же, как и сохранение обычного поля — назначьте объект нужного типа соответствующему полю. В этом примере обновляется атрибут blog экземпляра Entry entry , при условии, что соответствующие экземпляры Entry и Blog уже сохранены в базе данных (поэтому мы можем получить их ниже):
>>> from blog.models import Blog, Entry >>> entry = Entry.objects.get(pk=1) >>> cheese_blog = Blog.objects.get(name="Cheddar Talk") >>> entry.blog = cheese_blog >>> entry.save()
Обновление ManyToManyField работает немного иначе — используйте метод add() для добавления записи к отношению. Этот пример добавляет экземпляр Author joe к объекту entry :
>>> from blog.models import Author >>> joe = Author.objects.create(name="Joe") >>> entry.authors.add(joe)
Чтобы добавить несколько записей в ManyToManyField за один раз, включите в вызов несколько аргументов add() , например:
>>> john = Author.objects.create(name="John") >>> paul = Author.objects.create(name="Paul") >>> george = Author.objects.create(name="George") >>> ringo = Author.objects.create(name="Ringo") >>> entry.authors.add(john, paul, george, ringo)
Джанго сообщит, если вы попытаетесь назначить или добавить объект неправильного типа.
Получение объектов¶
Чтобы получить объекты из вашей базы данных, создайте QuerySet через Manager в своем классе модели.
QuerySet представляет коллекцию объектов из вашей базы данных. Может иметь ноль, один или несколько фильтров. Фильтры сужают результаты запроса на основе заданных параметров. В терминах SQL QuerySet приравнивается к оператору SELECT , а фильтр является ограничивающим предложением, таким как WHERE или LIMIT .
Вы получаете QuerySet , используя класс менеджер :class:` ~ django.db.models.Manager` вашей модели. Каждая модель имеет по крайней мере один Manager , и по умолчанию он называется objects . Доступ к нему напрямую через класс модели, например:
>>> Blog.objects >>> b = Blog(name='Foo', tagline='Bar') >>> b.objects Traceback: . AttributeError: "Manager isn't accessible via Blog instances."
Managers доступны только через классы модели, а не из экземпляров модели, чтобы обеспечить разделение между операциями на уровне таблицы и операциями на уровне записи.
Manager является основным источником QuerySets для модели. Например, Blog.objects.all() « возвращает :class:`~django.db.models.query.QuerySet`, который содержит все объекты «Blog в базе данных.
Получение всех объектов¶
Самый простой способ извлечь объекты из таблицы — это получить их все. Для этого используйте метод all() в классе Manager :
>>> all_entries = Entry.objects.all()
Метод all() возвращает QuerySet всех объектов в базе данных.