Как проверить, существует ли строка «много ко многим» в sqlalchemy, чтобы предотвратить дублирование?

#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)