Wenn ich mit der Entwicklung mit Django beginne, eine wiederverwendbare APP erstelle und in einem anderen Projekt installiere, kann ich die in der APP festgelegten Standardeinstellungen nicht ändern ... Also suchte ich nach einer Möglichkeit, die Einstellungen für jede Anwendung von ** project / settings.py ** zu ändern. Es gab guten Code in ** Django Rest Framework **, also habe ich es als Referenz versucht.
Nehmen wir als Beispiel eine einfache ** Todo Task Api **.
Arbeitsprobe Repository hier
project/settings.py
...
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 10
}
...
Ich habe es so geändert. Jetzt können Sie PAGE_SIZE ändern, wenn Sie Paginierung verwenden.
Schauen wir uns ein Beispiel an, wie es mit einer wirklich einfachen Todo Task-API funktioniert.
** Modell ** ist nur die folgende Aufgabe.
todo_api/models.py
from django.db import models
from .settings import api_settings
class Task(models.Model):
title = models.CharField(max_length=api_settings.TASK_TITLE_MAX_LENGTH)
status = models.IntegerField(choices=api_settings.TASK_STATUS_CHOICES)
** todo_api.settings.api_settings ** ist die Instanz, in der Sie die APP-Einstellungen sehen können. Sie können den Wert mit ** api_settings.KEY ** erhalten. In diesem Beispiel können die folgenden beiden in settings.py geändert werden.
Angenommen, der Standardeinstellungswert von ** TASK_STATUS_CHOICES ** wird in todo_api / settings.py wie folgt festgelegt.
todo_api/settings.py
DEFAULTS = {
'TASK_TITLE_MAX_LENGTH': 30,
'TASK_STATUS_CHOICES': [
(1, 'TODO'),
(2, 'DOING'),
(3, 'DONE'),
]
}
...
Wenn Sie dies ändern möchten, können Sie es ändern, indem Sie project / settings.py ändern.
project/settings.py
...
TODO_API = {
'TASK_STATUS_CHOICES': [
(1, 'TODO'),
(2, 'DOING'),
(3, 'DONE'),
(4, 'NEW_STATUS'),
],
}
Sie können den Aufgabenstatusoptionen ** NEW_STATUS ** hinzufügen, indem Sie den obigen Code hinzufügen. Schauen wir uns den detaillierten Code an.
Ich habe die Klasse ** APISettings ** sehr vereinfacht, indem ich mich auf ** Django Rest Framework ** bezog.
utils/api_settings.py
from django.conf import settings
class APISettings:
"""
A settings object, that allows API settings to be accessed as properties.
Set default settings in your app settings.py like this:
from app_utils.setting import APISettings
api_settings = APISettings('TODO_API', DEFAULTS)
For example:
from todo_api.settings import api_settings
print(api_settings.TASK_STATUS_CHOICES)
"""
def __init__(self, setting_root_name, defaults):
self._setting_root_name = setting_root_name
self._defaults = defaults
self._user_settings = getattr(settings, self._setting_root_name, {})
def __getattr__(self, item):
if item not in self._defaults:
raise AttributeError("Invalid {} setting: {}".format(self._setting_root_name, item))
try:
return self._user_settings[item]
except KeyError:
return self._defaults[item]
Es ist wichtig, die Methode getattr zu verwenden. Auf diese Weise können Sie mit api_settings.KEY auf die Einstellungen zugreifen. ** self._user_settings ** wird der Wert unter ** settings_root_name ** zugewiesen, der in project / settings.py festgelegt ist.
Verwenden wir nun die zuvor erstellten ** API-Einstellungen **, um ** eine Einstellungsinstanz für die TODO-APP ** zu erstellen.
todo_api/settings.py
from utils.app_setting import APISettings
DEFAULTS = {
'TASK_TITLE_MAX_LENGTH': 30,
'TASK_STATUS_CHOICES': [
(1, 'TODO'),
(2, 'DOING'),
(3, 'DONE'),
],
}
api_settings = APISettings('TODO_API', DEFAULTS)
Generieren Sie, indem Sie ** den Stammnamen der Einstellung ** als erstes Argument von APISettings und ** den Standardeinstellungswert ** als zweites Argument übergeben.
Damit sind die Einstellungen abgeschlossen.
Um die zuvor erstellten Einstellungen für TODO_API zu verwenden, importieren Sie einfach und greifen Sie darauf zu.
todo_api/models.py
from .settings import api_settings
print(api_settings.TASK_TITLE_MAX_LENGTH)
# > 30
Jetzt können Sie die Einstellungen der gepackten APP unter settings.py auf der Projektseite ändern. Als Fluss,
das ist alles.
Arbeitsprobe Repository hier
Na dann, ein gutes Django-Leben!
Recommended Posts