制作一个django可插拔应用程序通用,无需将其绑定到模型

时间:2010-10-15 07:19:17

标签: django django-models

你将如何制作一个可插拔的django应用程序,它可以接受来自任何模型的数据,然后对该数据进行一些操作(即保存到数据库,发送电子邮件)。此功能应该是通用的,不应与特定模型绑定。

1 个答案:

答案 0 :(得分:1)

这取决于您的应用提供的功能以及您希望应用用户以何种方式使用它的api。对于与其他模型的交互,您不知道有几种方法,具体取决于您的可重用应用程序的功能。您可以创建接受模型类或实例作为属性或参数的表单,视图等。另一种方法是让您的应用的用户在settings.py中指定相关模型,就像auth处理用户个人资料一样。例如,如果您的应用需要了解提供有关小工具信息的模型类,则用户可以指定:

#user's settings.py
GADGETS_MODEL='myapp.CustomSuperFunGadgets'

要获取用户指定模型的类,您可以这样做:

from django.core.exceptions import ImproperlyConfigured
from django.conf import settings
if not getattr(settings, 'GADGETS_MODEL', False):
        raise ImproperlyConfigured('You need to set GADGETS_MODEL'
                                          'in your project settings')
try:
    app_label, model_name = settings.GADGETS_MODEL.split('.')
except ValueError:
    raise ImproperlyConfigured('app_label and model_name should'
                    ' be separated by a dot in the GADGETS_MODEL set'
                    'ting')

try:
    model = models.get_model(app_label, model_name)
    if model is None:
              raise ImproperlyConfigured('Unable to load the gadgets '
                    'model, check GADGETS_MODEL in your project sett'
                    'ings')
except (ImportError):
     raise ImproperlyConfigured('Unable to load the gadgets model')
#at this poing model will hold a reference to the specified model class

与您不了解的模型交互的另一种方式是您的应用程序提供自定义模型字段或管理器或特殊属性,只是将信号处理程序附加到它们所附加的模型。

正如我所说,这完全取决于您的可重用应用程序试图解决的问题,您应采取的方法始终基于此。