【问题标题】:SQLAlchemy many to many relationship & Association objectSQLAlchemy 多对多关系和关联对象
【发布时间】: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


【解决方案1】:

错误是因为你与NewsletterInfo建立了关系,而不是Newsletter,所以这显然是集合所期望的类型。

与元信息的多对多关联并不少见。要通过User.newsletters 继续使用它,就好像它是常规关系一样,您必须设置一个association proxy。看看第一个例子。重要的部分是:

class User(db.Model):
    # ...
    newsletters = association_proxy('user_newsletters', 'newsletter')

class NewsletterInfo(db.Model):
    # ...
    user = relationship(User, backref=backref("user_newsletters"))
    newsletter = relationship("Newsletter")

【讨论】:

  • 感谢您的帮助。为了向用户添加时事通讯,我是否需要做任何不同的事情?现在我遇到了麻烦,我从文档中注意到:“要求子对象在附加到父对象之前与关联实例相关联”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2017-08-30
  • 2019-10-16
相关资源
最近更新 更多