Close
Edit

Django

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

Migrations

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

Class-based views

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

Django Exceptions

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

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

Form and field validation

view.py DeleteView

Django DeleteView

Django: DeleteView

view.py DetailView

pythontutorial: Django DetailView

view.py UpdateView

Generic editing views

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 REST: ViewSets

django shell

python manage.py shell

Request rest

Request and response objects

# 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()

Many-to-many relationships

Связанные списки

Получить записи, ссылающие на запись в списке

# 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()

Many-to-one relationships

tests

Пример с тестами:
Updating A Many-To-Many Relationship In Django: Add Tests

Ctrl + S : Update