Как я могу обеспечить наследование в моих моделях 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.