【发布时间】:2015-03-16 00:01:11
【问题描述】:
我无法配置简单的关系。我设法通过使用简单的关联表使其工作得相当好,但我想要额外的“元”字段,所以我正在研究使用关联对象模式。 (是的,我是数据库新手)
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flask
import os
import re
import datetime
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = False
db = SQLAlchemy(app)
class NewsletterInfo(db.Model):
__tablename__ = 'newsletter_info'
id = db.Column(db.Integer, primary_key = True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
newsletter_id = db.Column(db.Integer, db.ForeignKey('newsletter.id'))
date_added = db.Column(db.DateTime, default=datetime.datetime.now)
date_modified = db.Column(db.DateTime, default=datetime.datetime.now)
note = db.Column(db.String(140))
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(128), unique=True)
password = db.Column(db.String(128))
date_registered = db.Column(db.DateTime, default=datetime.datetime.now)
email_verified = db.Column(db.Boolean, default=False)
newsletters = db.relationship('NewsletterInfo')
class Newsletter(db.Model):
__tablename__ = 'newsletter'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
category = db.Column(db.String(36))
price = db.Column(db.String)
这里完全可以忽略flask的使用。
我基本上希望每个用户能够跟踪他们想要的尽可能多的时事通讯。每个 User>>Newsletter 连接都会有一些元信息,比如他们第一次添加它的时间,甚至还有一个可选的注释。
我在尝试执行“my_user.newsletters.append(my_newsletter)”时确实收到此错误
Attempting to flush an item of type <class 'Newsletter'> as a member of collection "User.newsletters". Expected an
object of type <class 'NewsletterInfo'> or a polymorphic subclass of this type.
这适用于我制作的原始表格,但显然我在这个稍微复杂的设置中做错了。
谁能帮助我解决我正在尝试配置的关系?我也担心这是一个糟糕的关系,所以希望得到有关标准关系设置的建议。
【问题讨论】:
-
这将有助于摆脱所有
Flask的东西并直接使用sqlalchemy编写一个自包含的示例。让示例越小越好。
标签: python sqlalchemy many-to-many flask-sqlalchemy