python - 在 Sqlalchemy 上删除多对多关系(关联对象)

标签 python flask sqlalchemy flask-sqlalchemy

我遇到了一个 SqlAlchemy 问题。

我只想删除一个关系。这种关系是由关联对象建立的。

模型

class User(db.Model, UserMixin):
    id                  = db.Column(db.Integer, primary_key=True)
    email               = db.Column(db.String(255), unique=True)
    username            = db.Column(db.String(255), unique=True)
    password            = db.Column(db.String(255))
    following           = db.relationship('Follower', foreign_keys='Follower.user_id')
    followed_by         = db.relationship('Follower', foreign_keys='Follower.follow_user_id')

    def __repr__(self):
        return '<%s (%i)>' % (self.username, self.id)

class Follower(db.Model):
    __tablename__       = 'followers'

    user_id             = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    follow_user_id      = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    created_at          = db.Column(db.DateTime, default=datetime.datetime.now)

    user_followed       = db.relationship("User", primaryjoin=(follow_user_id==User.id))
    user                = db.relationship("User", primaryjoin=(user_id==User.id))

    def __repr__(self):
        return '<%i %i>' % (self.user_id, self.follow_user_id)

我如何添加关系(有效!):

u1 = # user 1
u2 = # user 2

...

f = Follower()
f.user_followed = u2
u1.following.append(f)
db.session.commit()

我如何尝试删除关系(它不起作用):

f = Follower()
f.user_followed = u2

u1.following.remove(f)
db.session.commit()

错误

ValueError: list.remove(x): x not in list

我明白为什么它不起作用,这是因为这个 Follower() 实例不在列表 u1.following 中。那么,我该如何删除这个关系呢?

最佳答案

您可以覆盖 __eq____ne____hash__,以便不相同但具有相同值的实例进行比较和哈希值相等。

我为此使用了以下 mixin。只需覆盖子类中的 compare_value 即可返回实际应该比较的任何内容。

from sqlalchemy import inspect

class EqMixin(object):
    def compare_value(self):
        """Return a value or tuple of values to use for comparisons.
        Return instance's primary key by default, which requires that it is persistent in the database.
        Override this in subclasses to get other behavior.
        """
        return inspect(self).identity

    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented

        return self.compare_value() == other.compare_value()

    def __ne__(self, other):
        eq = self.__eq__(other)

        if eq is NotImplemented:
            return eq

        return not eq

    def __hash__(self):
        return hash(self.__class__) ^ hash(self.compare_value())

关于python - 在 Sqlalchemy 上删除多对多关系(关联对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477806/

相关文章:

Python 成像 : YCbCr problems

如果div类标题文本包含 "English",Python 3 BeautifulSoup获取URL(href或baseURL)

python - Flask 未在静态文件夹中检测到 .css

python-3.x - 从 SQLAlchemy 结果返回字段名称和值

amazon-web-services - 如何将 Superset 与 AWS athena 连接起来?

python - 如何从 SQLAlchemy 查询中获取 AVG?

python - 将两个单独的数据帧相乘

python - 在 Python 中计算两个分布的协方差矩阵

mysql - 我怎样才能将中文(如我)更新到 mysql

python、flask 和 jinja2 : passing parameters to url_for