Django: Postgres에서만 사용가능한 필드 금지시키기

Django에는 특정 데이터베이스 엔진에서만 사용가능한 필드가 몇 가지 있습니다. 문제가 되는 부분은, 만약 코드에 이러한 필드를 추가하게 된다면, 프로젝트는 다른 데이터베이스 엔진과 호환되지 않게 되는데, 자동으로 생성되는 마이그레이션들이 다른 엔진들에서는 실패하기 때문입니다.

그렇다고 이러한 필드를 쓰지 않는 것을 기억하는 것도 힘들고, 만약 큰 프로젝트에서 개발자들이 여럿 있을 경우 이를 지키는 것이 거의 불가능의 수준에 이르게 된다는 점입니다. 그래서 Django 시스템 체크를 사용한다면 이러한 필드들이 마이그레이션 파일을 만드는 것을 방지할 수 있습니다:

import inspect

import django.contrib.postgres.fields
import django.apps

from django.core.checks import Error, register


# noinspection PyUnusedLocal
@register()
def disallow_postgres_specific_fields_check(app_configs, **kwargs):
    errors = []
    disallowed_fields = [
        item[1]
        for item in inspect.getmembers(django.contrib.postgres.fields, inspect.isclass)
    ]

    for model in django.apps.apps.get_models():
        for field in model._meta.get_fields():
            for disallowed_field in disallowed_fields:
                # PyCharm 버그, 참조: https://youtrack.jetbrains.com/issue/PY-32860
                # noinspection PyTypeHints
                if isinstance(field, disallowed_field):
                    errors.append(
                        Error(
                            f"Field {field} cannot be used as it is a Postgres-specific field: "
                            f"{disallowed_field.__name__}",
                            hint="Use fields that are database engine-agnostic and provided by Django.",
                            id="config.E005", # 코드베이스에 적합한 ID를 사용하세요
                        )
                    )

    return errors

만약 필요하시다면 shipper 프로젝트에 사용된 최종 커밋을 여기에서 찾아보실 수 있습니다.

비슷한 게시물

댓글