Существует множество учебников по Django CRUD. Я искал учебник, который использует аннотацию типов Python, но не нашел ни одного, который бы мне понравился, поэтому я изучил его и сделал сам. Как мне кажется, получилось самое понятное руководство по подключению баз данных (БД), ORM, REST API и CRUD для Джанго из всех, что я видел.
Преимущество аннотации типов в том, что она выдает предупреждение о нарушении целостности типа, если вы поместите туда какой-либо несоответствующий тип. Иначе говоря, преимущество в том, что она помогает найти ошибку раньше, хотя при этом нет никакого прироста или потери производительности. У нас есть ссылка на github — вы можете сразу клонировать и запустить проект, который мы будем ковырять в образовательных целях дальше.
Сначала вам нужно установить Python версии 3.5+, он также установит инструмент управления пакетами Python pip. Есть еще один инструмент под названием `pipenv`, который представляет собой комбинацию pip и виртуального окружения, он позволяет легко управлять проектом.
Давайте попробуем, сначала установим его с помощью pip:
pip install pipenv
Он установит pipenv, мы будем использовать его для управления и песочницы нашего python-проекта. Это застрахует от вмешательства со стороны других проектов python на той же хост-машине. Теперь мы установим Python и Django и начнем создавать наш проект.
pipenv --three # Создаем виртуальную среду для этого проекта... pipenv install django # Добавление django в [пакеты] Pipfile...
Чтобы активировать виртуальную среду этого проекта, выполните следующее:
pipenv shell
После выполнения этой команды мы окажемся в виртуальной среде проекта, затем выполним следующую команду:
django-admin startproject InterconnectionContact .
Это создаст проект InterconnectionContact в вашей текущей директории. Не забудьте поставить точку `.` после имени проекта, иначе он создаст одноименные родительский каталог и имя проекта, что приведет к путанице.
Теперь проверьте структуру каталогов. Она будет выглядеть примерно так:
. ├── InterconnectionContact │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py ├── Pipfile └── Pipfile.lock
Теперь проверьте, правильно ли работает ваш проект:
pipenv run ./manage.py runserver
После этого последует такой вывод:
Performing system checks… System check identified no issues (0 silenced). You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run ‘python manage.py migrate’ to apply them. April 02, 2018–11:30:44 Django version 2.0.3, using settings ‘InterconnectionContact.settings’ Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
Если все идет правильно, вы увидите что-то вроде этого.
Давайте создадим приложение для этого проекта. Выполните следующую команду:
pipenv run ./manage.py startapp contact
Это создаст приложение contact для проекта ‘InterconnectionContact‘. Давайте проверим структуру каталогов.
. ├── contact │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── db.sqlite3 ├── InterconnectionContact │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py ├── Pipfile └── Pipfile.lock
Это наша начальная структура проекта. Давайте напишем немного кода. На самом деле мы будем писать код в файлах views.py и models.py и создадим другой файл urls.py в каталоге contact, который будет получать входящие запросы из основного файла urls.py проекта.
Давайте проверим код в файле models.py:
"""
models module for organising table and validation
"""
from django.db import models
class Contact(models.Model):
"""
A class for storing instance contact
"""
contact_id = models.AutoField(primary_key=True)
first_name = models.CharField(max_length=130, blank=True, null=True)
middle_name = models.CharField(max_length=130, blank=True, null=True)
last_name = models.CharField(max_length=130, blank=True, null=True)
email = models.EmailField(max_length=110, blank=True, null=True)
country = models.CharField(max_length=65, blank=True, null=True)
phone = models.CharField(max_length=19, null=True)
address = models.CharField(max_length=254, blank=True, null=True) Теперь переместим проект, который создаст таблицу в базе данных, для простоты мы будем использовать встроенную базу данных sqlite3.
python3.6 manage.py migrate
Создадим файл views.py, в нем мы напишем всю бизнес-логику.
"""
views for organising business logic
"""
from typing import Dict, Any
from django.http import Http404
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from contact.models import Contact
from contact.serializers import ContactSerializer
from django.http import HttpRequest, HttpResponse
class ContactView(APIView):
"""
Get or post a contact instance.
"""
def get(self, request: HttpRequest) -> Response:
"""
:param request:
:return:
"""
contact = Contact.objects.all()
serializer = ContactSerializer(contact, many=True)
return Response(serializer.data)
def post(self, request: HttpRequest) -> Response:
"""
:param request:
:return:
"""
serializer = ContactSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"serializer.data": 200, "status": status.HTTP_201_CREATED})
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ContactDetail(APIView):
"""
Update or delete a contact instance.
"""
def get_object(self, contact_id: int) -> Response:
"""
:param id:
:return:
"""
try:
return Contact.objects.get(contact_id=contact_id)
except Contact.DoesNotExist:
raise Http404
def get(self, request: HttpRequest, contact_id: int, format=None) -> Response:
"""
:param id:
:return:
"""
contact = self.get_object(contact_id)
serializer = ContactSerializer(contact)
return Response(serializer.data)
def put(self, request: HttpRequest, contact_id: int) -> Response:
"""
:param request:
:param id:
:return:
"""
contact = self.get_object(contact_id)
serializer = ContactSerializer(contact, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request: HttpRequest, contact_id: int) -> Response:
"""
:param request:
:param id:
:return:
"""
contact = self.get_object(contact_id)
contact.delete()
return Response(status=status.HTTP_204_NO_CONTENT) В этом файле views.py мы применим все CRUD-операции, используя два url’a.
Когда пользователь отправит запрос через файл urls.py, он найдет и выполнит соответствующий метод в классе в файле views.py. Вот наш файл urls.py:
from django.conf.urls import url
from django.urls import path
from contact.views import ContactView, ContactDetail
urlpatterns = [
path('api/v1/contact/', ContactView.as_view()),
path('api/v1/contact/<int:contact_id>', ContactDetail.as_view()),
] Для десериализации сериализации модели существует файл serializers.py. Он используется для преобразования объекта Python в json или наоборот.
from contact.models import Contact
from rest_framework import serializers
class ContactSerializer(serializers.ModelSerializer):
"""Serializes an Address object"""
class Meta:
model = Contact
fields = ("contact_id", "first_name", "last_name", "middle_name", "email", "country", "phone", "address")
И, наконец, есть корневой файл url.py в InterconnectionProject/urls.py.
Все входящие запросы сначала попадают сюда и перенаправляются в файл app contact/urls.py.
from django.conf.urls import url
from django.urls import include, path
urlpatterns = [
path('', include('contact.urls')),
] Это все, что у нас есть для вас на данный момент. Если вы хотите запустить этот проект, клонируйте его из репозитория github и следуйте инструкциям, приведенным в файле README.md
На фоне роста спроса на ликвидность в бычьем рынке 2025 года, криптозаймы снова выходят на…
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…