gpt4 book ai didi

python - 按子元素属性排序关系

转载 作者:行者123 更新时间:2023-12-01 00:31:22 25 4
gpt4 key购买 nike

我在 Flask 项目上使用 Flask-sqlalchemy 来为我的数据库建模。
我需要根据一侧不同子元素的属性对多对多关系的元素进行排序。

我有“Work”(父元素)、“Tag”(子元素)、“Type”(一对多) Tag 上的关系)和“Block”(类型上的一对多关系)。标签和作品通过映射表“work_tag_mapping”连接起来。

本质上,每个标签都只有一种类型,每种类型都属于一个 block ,并且可以在多个作品上添加多个标签。

我现在希望作品上的标签列表首先按 block 排序,然后按类型排序(两者都有一个“位置”列用于此目的)。

这是我的表格(为了解决问题而简化):

class Work(db.Model):
__tablename__ = 'work'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255, collation='utf8_bin'))
tags = db.relationship('Tag', order_by="Tag.type.block.position, Tag.type.position", secondary=work_tag_mapping)

class Tag(db.Model):
__tablename__ = 'tag'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255, collation='utf8_bin'))
type_id = db.Column(db.Integer, db.ForeignKey('type.id'), nullable=False)
type = db.relationship('Type')

work_tag_mapping = db.Table('work_tag_mapping',
db.Column('id', db.Integer, primary_key=True),
db.Column('work_id', db.Integer, db.ForeignKey('work.id'), nullable=False),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), nullable=False)
)

class Type(db.Model):
__tablename__ = 'type'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255, collation='utf8_bin'))
position = db.Column(db.Integer)
block_id = db.Column(db.Integer, db.ForeignKey('block.id'), nullable=False)
block = db.relationship('Block')

class Block(db.Model):
__tablename__ = 'block'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255, collation='utf8_bin'))
position = db.Column(db.Integer)

现在,“标签”关系中的“order_by”并没有像我最初希望的那样工作。我得到的错误是“sqlalchemy.exc.InvalidRequestError:属性'type'不是ColumnProperty的实例(即不直接对应于列)。”

我是 SQLalchemy、Flask 甚至 Python 的新手,这里的资源或问题都没有提到这样的情况。

最佳答案

虽然这似乎不可能直接实现,但添加一个 getter 并在检索时执行排序就可以解决问题。添加 lazy='dynamic' 确保集合表现为查询,因此可以执行联接。

_tags = db.relationship('Tag', lazy='dynamic')

@hybrid_property
def tags(self):
return self._tags.join(Type).join(Block).order_by(Block.position, Type.position)

关于python - 按子元素属性排序关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58159141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com