保持许多不同的django模型选择DRY的最佳方法是什么?

时间:2015-04-06 07:54:43

标签: python django web-services architecture

我将我的系统分离到许多应用程序中,其中每个应用程序都有许多模型,许多模型都来自

这是结构。

ROOT

  • 核心(用于保存通用的东西)
  • 解耦应用
  • 解耦应用
  • 解耦应用
  • ...
  • 解耦应用

在这些应用程序中,很多时候模型都有模型类型选择。例如,我有很多模型,比如这个事件和资源模型。

VIDEO = 1
AUDIO = 2
IMAGE = 3
ARTICLE = 4
BOOK = 5
DOCUMENT = 6

RESOURCE_CONTENT_CHOICES = (
    (VIDEO, _("video")),
    (AUDIO, _("audio")),
    (IMAGE, _("image")),
    (ARTICLE, _("article")),
    (BOOK, _("book")),
    (DOCUMENT, _("document")),
)
class Resource(models.Model):
    title = models.CharField(max_length=256)
    resource_content = models.IntegerField(choices=RESOURCE_CONTENT_CHOICES)
    url = models.URLField()

PAST = 1
PRESENT = 2
FUTURE = 3

EVENT_TYPE_CHOICES = (
    (PAST, _("past")),
    (PRESENT, _("present")),
    (FUTURE, _("future")),
)
class Event(models.Model):
    title = models.CharField(max_length=256)
    event_type = models.IntegerField(choices=EVENT_TYPE_CHOICES)

此外,很多时候像EVENT_TYPE_CHOICES这样的元组也被用在其他模型中。我还有大约20个其他型号event_type类型字段。

我以为我可以在核心应用程序中创建types.py文件,并在一个地方为所有类型编写一个dict,这样我就可以轻松地在视图,其他模型等中使用,因为应用程序不会在其他项目中重复使用无论如何。但我不确定这是否是最佳方法。

那么什么是使一切可扩展和干燥的最佳方法?

1 个答案:

答案 0 :(得分:1)

这取决于您对代码的预期用途。

解耦应用程序的目标是隔离许多Django项目中通常可重用的功能。但是,你提到了:

  

“......无论如何,你的应用程序都不会在其他项目中重复使用”

如果是这种情况,特别是如果应用程序不被认为是重用的良好候选者,则不必严格解耦应用程序。因此,在应用程序的核心使用单个Python文件,其中包含多个模型使用的各种选项列表。

像这样:

# choices.py
RESOURCE_CONTENT_CHOICES = (
    ...
)
EVENT_TYPE_CHOICES = (
    ...
)

并在需要时导入:

# models.py
from myproject.core.choices import EVENT_TYPE_CHOICES

class Event(models.Model):
    # Optional: See additional note below
    EVENT_TYPE_CHOICES = EVENT_TYPE_CHOICES
    ...
    event_type = models.IntegerField(choices=EVENT_TYPE_CHOICES)
    ...

或者,如果您发现某些应用确实适合重复使用,那么将它们分离比DRY更重要。在这种情况下,您应该在该应用程序中维护您的选择,即使某些选择在其他应用程序中的其他位置重复。

附加说明:使用这两种方法,对模型类中的选择进行引用通常非常有用。请参阅:https://docs.djangoproject.com/en/1.7/ref/models/fields/#choices