我正在开发一个由其他人编写的应用程序。它积极使用站点框架为两个不同的游戏站点提供服务。这些站点运行在相同的代码上,在相同的数据库上:
class Entry(models.Model):
headline = models.CharField(max_length=100)
body = models.TextField()
created = models.DateTimeField()
creator = models.ForeignKey(User)
# Site1 fields
best = models.BooleanField()
is_editor_post = models.BooleanField()
site1_views = models.IntegerField()
cnt_comments = models.IntegerField()
last_edit = models.DateTimeField()
editor = models.ForeignKey(User)
tags = models.ManyToManyField(Tag)
# Site2 fields
category = models.ForeignKey(Category)
blog = models.ForeignKey(Blog)
site2_views = models.IntegerField()
class Game(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
genre = models.ForeignKey(Genre)
release_date = models.DateField()
platform = models.ForeignKey(Platform)
# Site1 fields
mark = models.IntegerField()
badges = models.ManyToManyField(Badge)
badges_updated = models.DateTimeField()
# Site2 fields
requirements = models.CharField(max_length=255)
status = models.IntegerField()
has_news = models.BooleanField()
has_articles = models.BooleanField()
has_screenshots = models.BooleanField()
class Meta:
permissions = (
('site1_add_game', 'Site1/Can add game'),
('site2_add_game', 'Site2/Can add game'),
)
如您所见,有一堆字段对其中一个站点无用。此外,我们不使用默认权限,而是创建自己的权限。这是因为用户在两个站点之间共享,一个用户有权在两个站点上添加游戏,而另一个人只能在站点 2 上添加它。
在视图、模型和管理器方法中也有很多代码,如下所示:
def get_related_entries(self):
if settings.SITE_ID == 1:
# code for finding related entries on site1
elif settings.X_SITE_ID == 2:
# code for finding related entries on site2
return entries
因此,当我处理 site1 代码时,site2 中的字段和代码只会让我感到困惑。如果我向第一个站点添加一个功能,通常我不需要在另一个站点上添加这样的功能。此外,我可能必须编写第三个站点,他们希望该站点在相同的代码和数据库上运行。为什么?因为他们认为这可以使代码在不同站点之间重用和共享内容。这听起来很不错,而且确实有一堆代码,这在网站之间很常见。但是在相同的代码上运行它们的站点逻辑和模型结构也存在很大差异。
代码很难维护,而且看起来很难看,也不简单。解决方案可能是将常用应用程序和特定于站点的应用程序分开。但几乎所有应用程序都有特定于站点的代码。我认为如果我有两个不同的项目,每个项目都有自己的代码和模型,那会简单得多。
那么,站点框架是否适合这里?什么时候合适?为什么 Django “强烈鼓励”它正在使用?