Python orm like django

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

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

Читайте также:  Html elements with no content

Предполагая, что модели находятся в файле 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 всех объектов в базе данных.

Источник

Django LIKE

Summary: in this tutorial, you’ll learn how to query data using based on pattern matching in Django which is equivalent to the LIKE operator.

We’ll use the Employee models from the HR application for the demonstration. The Employee model maps to the hr_employee table in the database:

startswith and istartswith

Sometimes, you want to check if a string starts with a substring. For example, you may want to find employees whose first name starts with Je.

To do that in SQL, you use the LIKE operator like this:

SELECT * FROM hr_employee WHERE first_name LIKE 'Je%';Code language: Python (python)

The % is a wildcard that matches any number of characters. And the ‘Je%’ matches the strings that start with Je and are followed by zero or more characters.

To query data from Django using the LIKE operator, you use the startswith by appending it to a field name:

field_name__startswithCode language: Python (python)

For example, the following uses the filter() method to find employees whose first names start with Je :

>>> Employee.objects.filter(first_name__startswith='Je') SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE "hr_employee"."first_name"::text LIKE 'Je%' LIMIT 21 Execution time: 0.000998s [Database: default] , , , , , , , , ]>Code language: Python (python)

If you want to find employees whose first names start with Je case-insensitively, you can use the istartswith :

>>> Employee.objects.filter(first_name__istartswith='je') SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE UPPER("hr_employee"."first_name"::text) LIKE UPPER('je%') LIMIT 21 Execution time: 0.001398s [Database: default] , , , , , , , , ]>Code language: Python (python)

In this case, the __istartswith uses the uppercase version of the value for matching.

endswith and iendswith

The endswith and iendswith return True if a value ends with a substring. The endswith is equivalent to the following LIKE operator:

LIKE '%substring'Code language: Python (python)

For example, the following uses the endswith to find employees whose first names end with er :

>>> Employee.objects.filter(first_name__endswith='er') SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE "hr_employee"."first_name"::text LIKE '%er' LIMIT 21 Execution time: 0.000999s [Database: default] , , , , , , , , ]>Code language: Python (python)

It returns the employees with the first names Jennifer , Tyler , Spencer , Roger , etc.

The iendswith is the case-insensitive version of the endswith . For example:

>>> Employee.objects.filter(first_name__iendswith='ER') SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE UPPER("hr_employee"."first_name"::text) LIKE UPPER('%ER') LIMIT 21 Execution time: 0.000999s [Database: default] , , , , , , , , ]>Code language: Python (python)

contains and icontains

The contains allows you to check if a string contains a substring. It is equivalent to the following LIKE operator:

LIKE '%substring%'Code language: Python (python)

For example, the following finds the employees whose first name contains the substring ff :

>>> Employee.objects.filter(first_name__contains='ff') SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE "hr_employee"."first_name"::text LIKE '%ff%' LIMIT 21 Execution time: 0.001293s [Database: default] , , ]>Code language: Python (python)

The query returns the employees with the first names Tiffany and Jeffrey.

The icontains is the case-insensitive version of the contains . So you can use the icontains to check if a string contains a substring case-insensitively:

>>> Employee.objects.filter(first_name__icontains='ff') SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name", "hr_employee"."contact_id", "hr_employee"."department_id" FROM "hr_employee" WHERE UPPER("hr_employee"."first_name"::text) LIKE UPPER('%ff%') LIMIT 21 Execution time: 0.002012s [Database: default] , , ]>Code language: Python (python)

Summary

Django SQL LIKE Meaning
field_name__startswith=’substring’ field_name LIKE ‘%substring’ return True if field_name starts with a substring.
field_name__istartswith=’substring’ UPPER(field_name) LIKE UPPER(‘%substring’) return True if field_name starts with a substring case-insensitively
field_name__endswith=’substring’ field_name LIKE ‘substring%’ return True if field_name ends with a substring.
field_name__iendswith=’substring’ UPPER(field_name) LIKE UPPER(‘substring%’) return True if field_name ends with a substring case-insensitively
field_name__contains=’substring’ field_name LIKE ‘%substring%’ return True if field_name contains a substring.
field_name__icontains=’substring’ UPPER(field_name) LIKE UPPER(‘%substring%’) return True if field_name contains a substring case insensitively.

Источник

How to make a «LIKE» in a DJANGO ORM query?

How to Speed up Your WordPress Website

To make a query to get the data exactly in Django, I use filter , like this:

usuarios = Usuarios.objects.filter(nome='Jonh') 

This will generate a SQL similar to:

SELECT * FROM usuarios wHERE nome = 'Jonh' 

Since I’ve been using Django for a short time, I’d like to know how I would do to make a LIKE .

The database I’m using is Mysql.

2 answers

There are a few ways to run this query:

  • SQL: SELECT * FROM usuarios WHERE nome LIKE ‘%Jonh%’;
  • SQL: SELECT * FROM usuarios WHERE nome LIKE ‘Jonh%’;
  • SQL: SELECT * FROM usuarios WHERE nome LIKE ‘%Jonh’;
  • SQL: SELECT * FROM usuarios WHERE nome ILIKE ‘%Jonh%’;
  • SQL: SELECT * FROM usuarios WHERE nome ILIKE ‘Jonh%’;
  • SQL: SELECT * FROM usuarios WHERE nome ILIKE ‘%Jonh’;

The use of double underscore (__), defined by the constant LOOKUP_SEP is used by ORM — object-relational mapping — for generating SQL queries by separating the variable from the search command, as in the LIKE example: nome__iendswith=’Jonh’ interpreted for nome ILIKE ‘Jonh%’ .

Источник

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