@Alexey_vip

Как настроить many to many на flask?

Один тег всегда возвращает только оду первую картинку, вместо всех картинок которые были привязаны к данному тегу

tags = db.Table("tags",
            db.Column("img_id", db.Integer, db.ForeignKey("bimg.id")),
            db.Column("tag_id", db.Integer, db.ForeignKey("tag.id")),
            )


class Bimg(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    lib = db.Column(db.String(500))
    name = db.Column(db.String(500), nullable=True)
    webp = db.Column(db.String(500), nullable=True)
    date = db.Column(db.DateTime, default=datetime.utcnow)
    tags = db.relationship("Tag", secondary=tags, backref="posts")

    def __repr__(self):
        return "<Bimg %r>" % self.id


class Tag(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(5000), nullable=True)

    def __repr__(self):
        return "<Tag %r>" % self.name


#Загрузка файлов и получение тегов
    @application.route("/upload", methods=["POST", "GET"])
def upload():
    if request.method == "POST":
        f = request.files["file"]
        tag = request.form["tags"].split(",")
        c= "static/images/rz/"
        f.save(f"{c}" + f.filename)
        name = f.filename.split(".")[0]
        sa = Image.open(f"{c}" + f.filename)
        sa.save(f"{c}m/{name}.webp")
        webp = name + ".webp"
        save_db = Bimg(name=f.filename, lib=c, webp=webp)
        for i in tag:
            tags = Tag(name = i)
            save_db.tags.append(tags)
            db.session.add(save_db)
        db.session.commit()
        return render_template("/upload.html")
    else:
        return render_template("/upload.html")
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
ademaro
@ademaro
full-stack developer
Вы создаёте каждый раз новый тег, даже если если с таким названием существует
tags = Tag(name = i)

Соответственно он и привязывается к изображению.

1) Сделайте уникальное поле на имя тега (что бы они не плодились):
class Tag(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(5000), unique=True, nullable=True)


2) При добавлении тегов к изображению ищите сначала существующий:
...
tag = Tag.query.filter_by(name=i).first()  # у вас tags почему-то, хотя это один тег
if not tag:  # если в БД нет тега, то создаём
  tag = Tag(name=i)  # создаём новый тег, если его не нашлось в БД
save_db.tags.append(tag)  # добавляем тег к изображению существующий или только что созданный
...


3) рекомендую отрефакторить имена переменных, сами себя запутываете)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы