Python django orm filter

Создание запросов¶

После того как вы создали модели данных , 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) 

Джанго сообщит, если вы попытаетесь назначить или добавить объект неправильного типа.

Читайте также:  Коррекция перспективы opencv python

Получение объектов¶

Чтобы получить объекты из вашей базы данных, создайте 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 всех объектов в базе данных.

Источник

Оцените статью