0

我正在开发一个由其他人编写的应用程序。它积极使用站点框架为两个不同的游戏站点提供服务。这些站点运行在相同的代码上,在相同的数据库上:

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 “强烈鼓励”它正在使用?

4

1 回答 1

1

尽管我对站点框架没有太多经验,但我认为当您想对所有站点使用相同的管理界面时,这很有意义。这是您甚至没有提到的要求。

最近我考虑使用它,但经过一些初始编码后我决定反对它。事情变得非常复杂。如果到处都是声明,我基本上只在一个站点上需要额外的字段,权限处理看起来很棘手,几乎所有你提到的。

我确信站点框架有用例,但是如果疑问,我会选择带有可重用应用程序的单独项目,在需要时可以对模型进行子类化。

于 2011-03-09T22:50:35.960 回答