簡體   English   中英

保持許多不同的Django模型類型選擇為DRY的最佳方法是什么?

[英]What is the best approach to keep many different django model type choices DRY?

我將系統解耦到許多應用程序中,其中每個應用程序都有許多模型,許多模型都有

這就是結構。

  • 核心(用於保留通用內容)
  • 解耦的應用程序
  • 解耦的應用程序
  • 解耦的應用程序
  • ...
  • 解耦的應用程序

在這些應用程序中,模型通常會選擇模型類型。 例如,我有很多類似事件和資源模型的模型。

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模型,例如type field。

我當時想我可以在核心應用程序中創建types.py文件,並在一處為所有類型編寫一個字典,以便我可以輕松地在視圖,其他模型等中使用,因為應用程序無論如何都不會在其他項目中重用。 但是我不確定這是否是最好的方法。

那么使所有內容都可擴展和DRY的最佳方法是什么?

這取決於您對代碼的預期用途。

解耦應用程序的目標是隔離通常可在許多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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM