Рубрики
Без рубрики

Django Orm. если вы уже знаете SQL

Если вы мигрируете в Django из другого MVC Framework, шансы вы уже знаете SQL. В этом … с Джанго, питона меткой.

Если вы мигрируете в Django из другого MVC Framework, шансы вы уже знаете SQL.

В этом посте я буду иллюстрировать, как использовать Django ORM, рисуя аналогии к эквиваленту операторов SQL. Подключение новой темы к существующим знаниям поможет вам научиться использовать ARM быстрее.

Рассмотрим простую базовую модель для человека с именем атрибутов, возраста и пола.

Для реализации вышеуказанного объекта мы бы смоделировали его как таблицу в SQL.

CREATE TABLE Person (
    id int,
    name varchar(50),
    age int NOT NULL,
    gender varchar(10),
);

Же таблица моделируется в Django как класс, который наследует от базового класса Model. Орм создает эквивалентную таблицу под капотом.

class Person(models.Model):
    name = models.CharField(max_length=50, blank=True)
    age = models.IntegerField()
    gender = models.CharField(max_length=10, blank=True)

Большинство используемых типов данных:

Int. IntegerField ()
Varchar (n)
ТЕКСТ Текстовое поле()
ПОПЛАВКОВЫЕ (п) Floatfield ()
ДАТА DateField ()
ВРЕМЯ Timefield ()
DATETIME Datetimefield ()

Различные запросы, которые мы можем использовать:

ВЫБРАТЬ Заявление

Получить все строки SQL:

SELECT *
FROM Person;

Django:

persons = Person.objects.all()
for person in persons:
    print(person.name)
    print(person.gender)
    print(person.age)

Извлечь определенные столбцы SQL:

SELECT name, age
FROM Person;

Django:

Person.objects.only('name', 'age')

Получить разные ряды SQL:

SELECT DISTINCT name, age
FROM Person;

Django:

Person.objects.values('name', 'age').distinct()

Выборка определенного количества строк SQL:

SELECT *
FROM Person
LIMIT 10;

Django:

Person.objects.all()[:10]

Ограничение и смещение Ключевые слова SQL:

SELECT *
FROM Person
OFFSET 5
LIMIT 5;

Django:

Person.objects.all()[5:10]

Пункт

Фильтр по одному столбцу SQL:

SELECT *
FROM Person
WHERE id = 1;

Django:

Person.objects.filter(id=1)

Фильтр по сравнению операторами SQL:

WHERE age > 18;
WHERE age >= 18;
WHERE age < 18;
WHERE age <= 18;
WHERE age != 18;

Django:

Person.objects.filter(age__gt=18)
Person.objects.filter(age__gte=18)
Person.objects.filter(age__lt=18)
Person.objects.filter(age__lte=18)
Person.objects.exclude(age=18)

Между пунцом SQL:

SELECT *
FROM Person 
WHERE age BETWEEN 10 AND 20;

Django:

Person.objects.filter(age__range=(10, 20))

LIKE оператор SQL:

WHERE name like '%A%';
WHERE name like binary '%A%';
WHERE name like 'A%';
WHERE name like binary 'A%';
WHERE name like '%A';
WHERE name like binary '%A';

Django:

Person.objects.filter(name__icontains='A')
Person.objects.filter(name__contains='A')
Person.objects.filter(name__istartswith='A')
Person.objects.filter(name__startswith='A')
Person.objects.filter(name__iendswith='A')
Person.objects.filter(name__endswith='A')

В операторе SQL:

WHERE id in (1, 2);

Django:

Person.objects.filter(id__in=[1, 2])

И или не Операторы

SQL:

WHERE gender='male' AND age > 25;

Django:

Person.objects.filter(gender='male', age__gt=25)

SQL:

WHERE gender='male' OR age > 25;

Django:

from django.db.models import Q
Person.objects.filter(Q(gender='male') | Q(age__gt=25))

SQL:

WHERE NOT gender='male';

Django:

Person.objects.exclude(gender='male')

Нулевые значения

SQL:

WHERE age is NULL;
WHERE age is NOT NULL;

Django:

Person.objects.filter(age__isnull=True)
Person.objects.filter(age__isnull=False)

# Alternate approach
Person.objects.filter(age=None)
Person.objects.exclude(age=None)

По ключевому слову

Восходящий порядок SQL:

SELECT *
FROM Person
order by age;

Django:

Person.objects.order_by('age')

По убыванию порядок SQL:

SELECT *
FROM Person
ORDER BY age DESC;

Django:

Person.objects.order_by('-age')

INSERT INTO Заявление

SQL:

INSERT INTO Person
VALUES ('Jack', '23', 'male');

Django:

Person.objects.create(name='jack', age=23, gender='male)

Обновить оператор

Обновить один ряд SQL:

UPDATE Person
SET age = 20
WHERE id = 1;

Django:

person = Person.objects.get(id=1)
person.age = 20
person.save()

Обновить несколько строк SQL:

UPDATE Person
SET age = age * 1.5;

Django:

from django.db.models import F

Person.objects.update(age=F('age')*1.5)

ВЕЬЕТЕ

Удалить все строки SQL:

DELETE FROM Person;

Django:

Person.objects.all().delete()

Удалить определенные строки SQL:

DELETE FROM Person
WHERE age < 10;

Django:

Person.objects.filter(age__lt=10).delete()

Агрегация

Минимальная функция SQL:

SELECT MIN(age)
FROM Person;

Django:

>>> from django.db.models import Min
>>> Person.objects.all().aggregate(Min('age'))
{'age__min': 0}

MAX Функция SQL:

SELECT MAX(age)
FROM Person;

Django:

>>> from django.db.models import Max
>>> Person.objects.all().aggregate(Max('age'))
{'age__max': 100}

Функция AVG SQL:

SELECT AVG(age)
FROM Person;

Django:

>>> from django.db.models import Avg
>>> Person.objects.all().aggregate(Avg('age'))
{'age__avg': 50}

Сумма функции SQL:

SELECT SUM(age)
FROM Person;

Django:

>>> from django.db.models import Sum
>>> Person.objects.all().aggregate(Sum('age'))
{'age__sum': 5050}

COUNT Функция SQL:

SELECT COUNT(*)
FROM Person;

Django:

Person.objects.count()

Группа по выписку

Граф лица по признаку пола SQL:

SELECT gender, COUNT(*) as count
FROM Person
GROUP BY gender;

Django:

Person.objects.values('gender').annotate(count=Count('gender'))

Имея пункт

Граф лица по признаку пола, если количество людей больше, чем 1 SQL:

SELECT gender, COUNT('gender') as count
FROM Person
GROUP BY gender
HAVING count > 1;

Django:

Person.objects.annotate(count=Count('gender'))
.values('gender', 'count')
.filter(count__gt=1)

JOINS

Рассмотрим отношение внешнего ключа между книгами и издатель.

class Publisher(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

Имя издателя для книги SQL:

SELECT name
FROM Book
LEFT JOIN Publisher
ON Book.publisher_id = Publisher.id
WHERE Book.id=1;

Django:

book = Book.objects.select_related('publisher').get(id=1)
book.publisher.name

Принесите книги, которые имеют конкретный издатель SQL:

SELECT *
FROM Book
WHERE Book.publisher_id = 1;

Django:

publisher = Publisher.objects.prefetch_related('book_set').get(id=1)
books = publisher.book_set.all()

Соединять

Если вам понравился этот блог, не стесняйтесь связаться со мной на Twitter где я делюсь новые посты блога каждую неделю.

Оригинал: “https://dev.to/amitness/django-orm-if-you-already-know-sql-k80”