@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")
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 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) рекомендую отрефакторить имена переменных, сами себя запутываете)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы