Django
Django
источник: Django Software Foundation
ключи: #django #python
Ключи: #python
только важные выдержки
install
Передаем переменную среды DEBIAN_PRIORITY=low в команду установки.
В связи с этим, процедура установки предложит вам настроить некоторые дополнительные опции.
установка postfix:
sudo apt update
sudo DEBIAN_PRIORITY=low apt install postfix
planing models structure
menu_list_category
menu_list_discipline
menu_list_group
menu_list_theme
menu_list_page
pages_list
key_words_list
key_words
doc_page
p parent pid
doc_page_arch
doc_block
doc_bloc_arch
parser:
Models
Models
Many-to-many relationships
Models
Миграции
p manage.py showmigrations
python manage.py makemigrations
python manage.py migrate
python manage.py makemigrations --name changed_my_model your_app_label
# Reversing migrations, откат миграций
python manage.py migrate books 0002
python manage.py migrate books zero
# посмотреть построенные запросы в базу
python manage.py sql auth
dumpdata
python manage.py dumpdata > dumpfile.json
python manage.py dumpdata app > dumpfile.json
python manage.py dumpdata app.model > dumpfile.json
python manage.py dumpdata --exclude auth.permission \
--exclude contenttypes > db.json
python manage.py loaddata db.json
python manage.py loaddata ./dumps/doc_2.json
Вариант программного создания дампа:
from django.core.management import call_command
output = open(output_filename,'w') # Point stdout at a file for dumping data to.
call_command('dumpdata','model_name',format='json',indent=3,stdout=output)
output.close()
How to make db dumpfile in django
ForighnKey на эту же модель
или ещё не объявленную
parent = models.ForeignKey("self")
# или
parent = models.ForeignKey("CategoryModel")
errors
django (fields.E304) Reverse accessor
class Person2Person(models.Model):
person = models.ForeignKey(Person, related_name='person2persons')
friend = models.ForeignKey(Person, related_name='friends')
Для следующих ошибок, нужно закончить выполнение миграции:
python manage.py loaddata
CommandError: Unable to serialize database: cursor "_django_curs_139754911668032_sync_9" does not exist
complit migration.
error: (admin.E109) The value of 'list_display[14]' must not be a ManyToManyField.
How to show a many-to-many field with "list_display" in Django Admin?
view.py
Form handling with class-based views
Introduction to class-based views
Introduction to class-based views
Rest
Class-based Views
Tutorial 6: ViewSets & Routers
django tpl 2 jinja2 tpl
Porting a Django app to Jinja2 templates
model field types
Basic model data types and fields list
model field choice
class Entry(models.Model):
LIVE_STATUS = 1
DRAFT_STATUS = 2
HIDDEN_STATUS = 3
STATUS_CHOICES = (
(LIVE_STATUS, 'Live'),
(DRAFT_STATUS, 'Draft'),
(HIDDEN_STATUS, 'Hidden'),
)
# ...some other fields here...
status = models.IntegerField(choices=STATUS_CHOICES, default=LIVE_STATUS)
live_entries = Entry.objects.filter(status=Entry.LIVE_STATUS)
draft_entries = Entry.objects.filter(status=Entry.DRAFT_STATUS)
if entry_object.status == Entry.LIVE_STATUS:
# do something with live entry
Model field reference: choices
Handle choices the right way
choices
Уникальное поле
serial_number = models.CharField(max_length=64, unique=True)
Field many to many
class PurchaseOrder(models.Model):
product = models.ManyToManyField('Product')
vendor = models.ForeignKey('VendorProfile')
dollar_amount = models.FloatField(verbose_name='Price')
def get_products(self, obj):
return "\n".join([p.products for p in obj.product.all()])
# or
def get_products(self):
return "\n".join([p.products for p in self.product.all()])
show a many-to-many field with "list_display" in Django Admin
Поля created, updated
class MyModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Automatic creation date for Django model form objects
Django Exceptions
from django.core.exceptions import ObjectDoesNotExist
try:
# try something
except ObjectDoesNotExist:
# do something
URL dispatcher
from django.urls import path, re_path
from . import views
urlpatterns = [
path("articles/2003/", views.special_case_2003),
re_path(r"^articles/(?P<year>[0-9]{4})/$", views.year_archive),
re_path(r"^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$", views.month_archive),
re_path(
r"^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$",
views.article_detail,
),
]
urlpatterns = [
re_path(r"^blog/(page-([0-9]+)/)?$", blog_articles), # bad
re_path(r"^comments/(?:page-(?P<page_number>[0-9]+)/)?$", comments), # good
]
URL dispatcher custom
from django.urls import path, register_converter
from . import views
class LangConverter:
# regex = "[0-9]{4}"
# regex = "[a-z]{2}"
regex = "(ru|en)"
def to_python(self, value):
return str(value)
def to_url(self, value):
return str(value)
# return "%04d" % value
register_converter(LangConverter, "lang")
urlpatterns = [
path("articles/ru/", views.special_case_ru),
path("articles/<lang:lang>/", views.lang_arts),
...,
]
Registering custom path converters
Using the Django authentication system
Using the Django authentication system
UniqueConstraint
class Customer(models.Model):
path = models.CharField(max_length=100)
lang = models.CharField(max_length=100)
class Meta:
constraints = [
models.UniqueConstraint(name="path_lnag",
fields=['path','lang']),
]
Model Meta options: constraints
Constraints reference: UniqueConstraint
ограничение
Список ограничений, которые вы хотите определить для модели:
class Customer(models.Model):
age = models.IntegerField()
class Meta:
constraints = [
models.CheckConstraint(
condition=models.Q(age__gte=18),
name="age_gte_18"),
]
Model Meta options: constraints
Form validation
view.py DeleteView
view.py DetailView
pythontutorial: Django DetailView
view.py UpdateView
ModelViewSet
import inspect
from inspect import currentframe, getframeinfo
def PageViewSet(viewsets.ModelViewSet):
...
# catch update request in class based on viewsets.ModelViewSet
def update(self, request, pk=None):
print(json.loads(request.body.decode())['id'])
frameinfo = getframeinfo(currentframe())
print(frameinfo.filename,inspect.stack()[0][3], \
frameinfo.lineno,sep=':')
return super().update(request, pk)
django shell
python manage.py shell
Request rest
# pk
print(json.loads(request.body.decode())['id'])
pk in model
set primari key in model
id = models.AutoField(primary_key=True)
change primary keys in an existing Django ap
Error: login SCRF error
https://stackoverflow.com/questions/29573163/django-admin-login-suddenly-demanding-csrf-token
dir path
BASE_DIR = os.path.dirname(\
os.path.dirname(os.path.abspath(__file__)))
from django.conf import settings
...
...
print(settings.BASE_DIR)
django project root self discovery
Many-to-many relationships
Получить связанные позции
# models.py
class ListModel(models.Model)
name = models.CharsField()
class DataModel(models.Model)
list = ManyToManyField(ListModel)
# view.py
...
# list item by primary key 1
list_item = ListModel.objects.get(pk=1)
# data item by primary key 1
data_item = DataModel.objects.get(pk=1)
# create relation bitwin list and data models
data_item.list.add(list_item)
# list of data related with list item
data = list_item.datamodel_set.all()
# array of list items related with dataitem
lists = data_item.list.all()
Связанные списки
Получить записи, ссылающие на запись в списке
# models.py
class ListModel(models.Model)
name = models.CharsField()
class DataModel(models.Model)
list = ForeginKey(ListModel)
# view.py
...
# list item by primary key 1
list_item = ListModel.objects.get(pk=1)
# list of data related with list item
data = list_item.datamodel_set.all()
tests
Пример с тестами:
Updating A Many-To-Many Relationship In Django: Add Tests