Поля моделей (используются в практикуме)
| Поле |
Назначение |
Ключевые параметры |
CharField | Строка | max_length, unique, choices |
TextField | Длинный текст | null=True, blank=True |
DateTimeField | Дата и время | auto_now_add=True, auto_now=True, null=True |
FileField | Загрузка файлов | upload_to='папка/' |
ForeignKey | Связь многие-к-одному | on_delete=models.CASCADE |
ManyToManyField | Связь многие-ко-многим | related_name, blank=True |
Класс Meta — все опции практикума
class Project(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-name'] # порядок убывания по имени
verbose_name = 'Project' # ед. число
verbose_name_plural = 'Projects' # мн. число
unique_together = (('name', 'created_at'),) # уникальность по двум полям
Admin — основные атрибуты ModelAdmin
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
list_display = ['title', 'project', 'status', 'priority', 'created_at', 'due_date']
search_fields = ['title'] # поиск по полям
list_filter = ['status', 'priority', 'project', # фильтры на боковой панели
'created_at', 'due_date']
actions = ['change_status'] # список действий
def change_status(self, request, queryset):
queryset.update(status='Closed')
change_status.short_description = 'Mark as Closed'
Admin — property + display method
class Project(models.Model):
files = models.ManyToManyField('ProjectFile', related_name='projects')
@property
def count_of_files(self):
return self.files.count()
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
list_display = ['name', 'display_count_of_files', 'created_at']
def display_count_of_files(self, obj):
return obj.count_of_files
display_count_of_files.short_description = 'Count of Files'
Admin — действие с заменой символов
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
actions = ['replace_spaces_with_underscores']
def replace_spaces_with_underscores(self, request, queryset):
for obj in queryset:
obj.name = obj.name.replace(' ', '_')
obj.save()
replace_spaces_with_underscores.short_description = 'Replace spaces with underscores'
Fixtures — команды manage.py
# Создать снимок групп разрешений
python manage.py dumpdata auth.Group --natural-foreign --indent=4 > fixtures/groups_fixture.json
# Создать снимок пользователей
python manage.py dumpdata auth.User --natural-foreign --indent=4 > fixtures/users_fixture.json
# Восстановить данные из снимка
python manage.py loaddata fixtures/groups_fixture.json
python manage.py loaddata fixtures/users_fixture.json
# Пересоздать базу данных
# 1. Удалить db.sqlite3
# 2. python manage.py makemigrations
# 3. python manage.py migrate
Validators
from django.core.validators import MinLengthValidator
class Task(models.Model):
title = models.CharField(
max_length=255,
unique=True,
validators=[MinLengthValidator(10)] # минимум 10 символов
)