如何解决单独的常量文件中的Django模型选择
根据django docs,处理模型中选择字段的最佳方法是这样的:
class Book(models.Model):
AVAILABLE = 'available'
BORROWED = 'borrowed'
ARCHIVED = 'archived'
STATUS = [
(AVAILABLE,'Available to borrow'),(BORROWED,'Borrowed by someone'),(ARCHIVED,'Archived - not available anymore'),]
# […]
status = models.CharField(
max_length=32,choices=STATUS,default=AVAILABLE,)
但是,我的应用程序增长了很多,并且扩展了不同应用程序之间的互连模型。在某些情况下,我只需要导入模型类即可使用常量值
例如:
# some other file
from book.models import Book
def do_stuff_if_borrowed(book):
if (book.status == Book.BORROWED):
# do stuff
pass
我想尽可能避免在其他文件中导入模型,因为这会引起很多循环导入问题,总的来说,我认为这不是最干净的方法。我很快检查了一下,没有发现有人提出如何外部化这些模型常量的解决方案,例如:
book / constants.py
AVAILABLE = 'available'
BORROWED = 'borrowed'
ARCHIVED = 'archived'
STATUS = [
(AVAILABLE,]
book / models.py
from .constants import STATUS,AVAILABLE
class Book(models.Model):
status = models.CharField(
max_length=32,)
然后如果我只需要常量,则不需要导入Book模型,而只需导入constants.py
有没有理由不这样做吗?
解决方法
我正在做一个我们正在考虑类似事情的项目。它连接到另一个服务API,该API具有我们提取的指标和定义。因此,我们考虑过仅按常规方式提取这些文件,并将其存储在metrics.json文件之类的文件中,而不是在模型中使用它们。
这非常流畅而且不错,但是我认为您失去的是对模型更改的可见性,这些更改导致需要创建,跟踪和运行迁移。
在您的实例中,常量似乎并没有真正改变,而只是为了干燥。似乎可以创建该常量文件,然后添加一个方法,以返回模型的带前缀状态,如果您确实希望每个模型都具有不同的状态。
在这种情况下,您要牺牲的是轻松地直接从模型中引用这些值。在文档的示例中,您可以使用Book.STATUS_BORROWED
引用状态。但是在您的示例中,您实际上必须分别导入这些常量。
我认为最好的解决方案是制作一个可以覆盖此内容的mixin,并使所有需要这些状态的模型都从中继承。
class BorrowableBookMixin(models.Model):
STATUS_AVAILABLE = 'available'
STATUS_BORROWED = 'borrowed'
STATUS_ARCHIVED = 'archived'
STATUS_CHOICES = [
(STATUS_AVAILABLE,'Available to borrow'),(STATUS_BORROWED,'Borrowed by someone'),(STATUS_ARCHIVED,'Archived - not available anymore'),]
status = models.CharField(
max_length=32,choices=STATUS_CHOICES,default=STATUS_AVAILABLE,)
class Meta:
abstract = True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。