Если вы мигрируете в 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”