from django.db import models
class DjangoModel(models.Model):
field1 = models.CharField(max_length=10)
field2 = models.IntegerField()
field3 = models.DateTimeField()
# We frequently use timestamps like this that the ORM updates automatically on creation and modification respectively.
created_timestamp = models.DateTimeField(auto_now_add=True)
modified_timestamp = models.DateTimeField(auto_now=True)
related = models.ForeignKey(SomeOtherDjangoModel, related_name='related_backref')
class Meta:
db_table = 'sql_table_name'
Flask-SQLAlchemy模型:
from flask import current_app
from flask_sqlalchemy import SQLAlchemy
import datetime
# The next three lines should be in your application.py ideally.
db = SQLAlchemy()
db.init_app(current_app)
db.Model.metadata.reflect(db.engine)
class FlaskSQLAlchemyModel(db.Model):
# All 6 fields from the django model and the implicit 'id' field django
# adds to its models will get reflected automatically the way this model
# is coded. The created_timestamp and modified_timestamp fields require
# special code for Flask-SQLAlchemy to update them automatically when
# you save a model instance. Relationships must be defined manually in
# Flask-SQLAlchemy, so there's code for that, too.
__table__ = db.Table('sql_table_name', db.Model.metadata,
# You'll need to "override" the timestamp fields to get flask-sqlalchemy to update them automatically on creation and modification respectively.
db.Column('created_timestamp', db.DateTime, default=datetime.datetime.now),
db.Column('modified_timestamp', db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now),
autoload=True,
extend_existing=True,
autoload_with=db.engine,
)
# You need to do model relationships manually in SQLAlchemy...
related = db.relationship(SomeOtherFlaskSQLAlchemyModel, backref=db.backref('related_backref', lazy='dynamic'))
2条答案
按热度按时间ycl3bljg1#
在我们的工作场所,我们在同一个网站上同时使用django和flask,原因是django的管理和模型系统编写代码非常快,而且它是我们的后台(staff only)管理界面。另一方面,在flask中编写前端要容易得多,因为每个页面可以简单到一个python函数和一个Jinja 2模板。Flask表单需要一个额外的表单模型类(很容易写),它指定表单中的所有字段,如果表单响应要保存到SQL数据库,则使用第二个SQLAlchemy模型。如果您要在django中编写相同的表单,最简单的情况是您不编写表单模型,因为django框架隐式地从sql模型中生成了它。不过在flask中写“常规”页面还是更快。
至于让这两个模型一起运行,我们首先编写django模型,因为数据库管理和sql schema迁移都集成到django中,然后我们使用SQLAlchemy的一个特性“reflection”读取sql数据库并从schema生成sql模型,这样,当我们对django模型进行更改时,我们运行manage.pymigrate(其将模式改变部署到SQL数据库),并且SQLAlchemy模型自动反映新的模式,而我们不必接触Flask-SQLAlchemy模型。下面是一个示例,其中包含了一些外键和一些时间戳,它们在您使用ORM保存模型时会自动更新。这两种用例都很常见,而且都需要额外的代码。
Django模型:
Flask-SQLAlchemy模型:
以这种方式定义Flask-SQLAlchemy模型的警告是,它们依赖于SQL数据库。在您尝试导入模型所在的.py文件之前,需要正确配置Flask-SQLAlchemy及其
db
对象,否则导入时会出现一些严重错误。如果您将db
的定义与模型放在同一个文件中,它被初始化为:然后,您需要这样做导入:
当然,
app
需要加载Flask-SQLAlchemy的配置设置,否则将无法正常工作。通常最好只使用模型文件执行from application import db
,并在application.py设置db
后使用www.example.com执行from my_models import *
。正确配置后,Flask-SQLAlchemy模型将等效于如下定义的Flask-SQLAlchemy模型:
一旦你得到了django模型和反射的flak-sqlalchemy模型,你就可以使用django的awesome migrate命令创建带有正确模式的表,然后flak-sqlalchemy模型会注意到它们已经被创建并自动填充自己,这样你就只需要担心django模型了(减去时间戳字段和模型关系),剩下的就让flank-sqlalchemy来反映。
你需要做的最后一件事是配置Flask-SQLAlchemy和Django指向同一个SQL数据库,我想你知道怎么做。我给予你的一个提示是,settings.pyFlask和Django的www.example.com可以是同一个文件,没有任何冲突。
vvppvyoh2#
第一,不要这样做;你将面临一个痛苦的世界。使用API在应用程序之间传递数据。
但如果你真的这么做了,实际上迁移并没有什么问题。只需要在一个应用程序中编写所有的程序,Django或Alembic,然后在那里运行它们。因为它们共享一个数据库表,所以这就是全部。