🔖 Справочник: Meta, Admin, Fixtures

Шпаргалка по всем конструкциям практикума

⚡ Быстрая шпаргалка

# Meta
class Meta:
    ordering = ['-created_at']
    verbose_name = 'Task'
    verbose_name_plural = 'Tasks'
    unique_together = (('title', 'project'),)

# Admin
@admin.register(Model)
class ModelAdmin(admin.ModelAdmin):
    list_display = ['field1', 'field2']
    search_fields = ['name']
    list_filter = ['status', 'created_at']
    actions = ['my_action']

    def my_action(self, request, queryset):
        queryset.update(field='value')
    my_action.short_description = 'Label'

# Fixtures
python manage.py dumpdata app.Model --indent=4 > file.json
python manage.py loaddata file.json

Поля моделей (используются в практикуме)

Поле Назначение Ключевые параметры
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 символов
    )