【问题标题】:Django - flexible models? [closed]Django - 灵活的模型? [关闭]
【发布时间】:2016-03-21 05:41:29
【问题描述】:

我是 Django 新手,想用它做一个简单的 CMS。

应该有一个页面模型。用户应该能够设置页面类型,然后应该可以使用不同的字段。

例如(简化 - 实际上会有更多字段):

Page - Type 1: title, text
Page - Type 2: title, text, images
Page - Type 3: title, text_column_1, text_column_2, images, links, downloads

我将预定义字段。用户将无法更改它们。

如何在不为每种类型创建单独的(子)模型的情况下使用 Django 最好地解决此类问题?

【问题讨论】:

    标签: django django-models


    【解决方案1】:
    class PageFieldDefinitions(models.Model):
        field_name = models.CharField(max_length=100, blank=True, default='', null=True)
    
    class Pages(models.Model):
        name = models.CharField(max_length=100, blank=True, default='', null=True)
    
    class PageFieldContent(models.Model):
        content = models.CharField(max_length=100, blank=True, default='', null=True)
        page_field = models.ForeignKey(PageFieldDefinitions)
        page = models.ForeignKey(Pages)
    

    对于 Django: 你可以使用上面的模型。我正在使用这种模型来填充我的模型。如果使用“大”模型,则无法动态扩展模型。因为预测模型的大小并不容易。可以在您的管理站点上使用它。

    另外,我使用 Django 和 PostgreSQL,如果你不修改数据库,这个数据库不支持全文搜索。 (http://www.postgresql.org/docs/9.3/static/textsearch.html)

    对于 Meteor: 如你所知或不知道 MeteorJS 是一个使用 MongoDB 的全栈框架。就我使用的情况而言,Mongo 是一个快速的 NoSQL DB,并且支持全文搜索。如果你没有很好地创建你的数据库,你会发现由于 NoSQL 而缺乏数据完整性。如果您是一位经验丰富的 JS 开发人员,与 Django 相比,使用 Meteor 开发 CMS 系统所需的时间会更少。

    在我的项目中,我需要一个快速的搜索引擎和数据完整性。我为 Django 定义了两个数据库。我使用 Mongo 作为搜索引擎,使用 PostgreSQL 来保存我的数据。

    阅读以下来源: Django 中的 Mongo:http://django-mongodb-engine.readthedocs.org/en/latest/topics/setup.html

    Django 中的多个数据库:https://docs.djangoproject.com/en/1.9/topics/db/multi-db/

    Django 中的多数据库和多模型:multiple databases and multiple models in django

    settings.py

    DATABASES = {
        'default': {
            'NAME': 'app_data',
            'ENGINE': 'django.db.backends.postgresql',
            'USER': 'postgres_user',
            'PASSWORD': 's3krit'
        },
        'search': {
            'ENGINE' : 'django_mongodb_engine',
            'NAME' : 'my_database',
            ...
            'OPTIONS' : {
               'socketTimeoutMS' : 500,
                ...
            }
        }
    } 
    

    models.py

    class SearchContent(models.Model):
        content = models.CharField(max_length=100, blank=True, default='', null=True)
        class Meta:
            app_label = 'my_database'
    

    【讨论】:

    • 谢谢!我将调查您的示例和链接。 Meteor 和 MongoDB 对我来说越来越有趣了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2011-08-03
    • 2013-08-01
    • 2016-06-16
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多