Как я могу обеспечить наследование в моих моделях Django? [закрыто]

В моем приложении Django у меня есть абстрактная модель MyModel, которая имеет, например, поля created_at и updated_at. Я хочу, чтобы все модели в моем проекте были подклассами MyModel, а не использовали django.db.models.Model напрямую.

В нашем приложении работает несколько разработчиков, поэтому я хочу использовать какой-то линтер или CI-проверку для обеспечения этого. Есть ли плагин flake8 или что-то подобное, что я могу использовать для обеспечения такого наследования?

Как упомянул Willem Van Onsem в своем комментарии, вы можете написать свои собственные проверки, используя System check framework.

Предположим, что у нас есть следующие модели, причем Parent в приложении с именем "checktest" является моделью, от которой должны наследоваться все модели:

from django.db import models


class Parent(models.Model):
    class Meta:
        abstract = True


# This should raise an error
class Foo(models.Model):
    pass


# This should be fine
class Bar(Parent):
    pass

Напишем проверку следующим образом в файле checktest/custom_checks.py, обратите внимание, что список APPS_TO_TEST содержит имена приложений, модели которых должны наследоваться от родительского класса:

from django.apps import apps
from django.core.checks import Error, register, Tags
from .models import Parent

# List of apps that should inherit from Parent
APPS_TO_TEST = ["checktest"]


@register(Tags.models)
def model_must_inherit(app_configs, **kwargs):
    errors = []
    for app in APPS_TO_TEST:
        models = apps.get_app_config(app).get_models()
        for model in models:
            if not issubclass(model, Parent):
                errors.append(Error(
                    f"Model {model.__name__} does not inherit from Parent",
                    hint="Models must inherit from the Parent class",
                    obj=model,
                    id="checktest.E001"
                ))
    return errors

В методе app configs ready мы импортируем вышеуказанный файл, чтобы проверка была запущена:

from django.apps import AppConfig


class ChecktestConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'checktest'

    def ready(self) -> None:
        from . import custom_checks

Теперь при выполнении таких команд, как runserver или migrate, проверки будут выполняться неявно. В среде CI вы можете явно запустить проверки с помощью команды check.

Вернуться на верх