#flask-sqlalchemy
#колба-sqlalchemy
Вопрос:
Вот код для моих моделей:
class IllustratorAsset(db.Model): id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) uploader = db.Column(db.Integer, db.ForeignKey('user.id')) project = db.Column(db.Integer, db.ForeignKey('project.id')) fragments = db.relationship('AssetFragment', backref='ai', lazy='dynamic') file_hash = db.Column(db.String(128), unique=True) file_name = db.Column(db.String(128)) def __repr__(self): return 'lt;Picture {}gt;'.format(self.id) tags_association = db.Table( 'tags_association', db.Column('fragment_id', db.Integer(), db.ForeignKey('asset_fragment.id'),index=True), db.Column('tag_id', db.Integer(), db.ForeignKey('tag.id'),index=True), PrimaryKeyConstraint('fragment_id', 'tag_id') ) class AssetFragment(db.Model): id = db.Column(db.Integer, primary_key=True) asset = db.Column(db.Integer, db.ForeignKey('illustrator_asset.id')) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) uploader = db.Column(db.Integer, db.ForeignKey('user.id')) tags = db.relationship('Tag', secondary=tags_association, backref='fragments', lazy='dynamic') file_name = db.Column(db.String(128)) file_hash = db.Column(db.String(128)) class Tag(db.Model): id = db.Column(db.Integer, primary_key=True) tag = db.Column(db.String(64), index=True, unique=True) def __repr__(self): return 'lt;Tag {}gt;'.format(self.tag)
Идея заключается в хранении иллюстраций, есть ресурс (файл Adobe Illustrator), в нем есть фрагменты (визуализация его различных фрагментов), во фрагменте есть несколько тегов для быстрого поиска, которые должны работать через отношения «многие ко многим». _ассоциация.
В настоящее время я застрял в попытке проверить, существует ли уже ассоциация, я уверен, что есть какой-то простой способ сделать это, но я упускаю какой-то момент. Я придумал код ниже, и я все еще получаю исключение ограничений.
for tag in new_tags: #list of tags from form t = Tag.query.filter_by(tag=tag).first() if (t is not None) and not(t in fragment.tags): fragment.tags.append(t) else: new_tag = Tag(tag=tag) if not(new_tag in fragment.tags): fragment.tags.append(new_tag)
БД-это Postgres
Ответ №1:
Ну, ответ пришел вскоре после того, как я попытался сделать это в оболочке колбы. Выход оболочки
Я понял, что, похоже, что-то не так с компаратором, простое переопределение заставляет его работать:
def __eq__(self, __o: object) -gt; bool: return self.tag == __o.tag
Также нужно было немного изменить проверку:
for tag in new_tags: t = Tag.query.filter_by(tag=tag).first() if t is None: new_tag = Tag(tag=tag) print(new_tag) if not(new_tag in fragment.tags): fragment.tags.append(new_tag) else: print(t) if not(t in fragment.tags): fragment.tags.append(t)