Flask SQLAlchemy多对多插入重复项

2024-05-19 01:44:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个Flask SQLAlchemy API,它包含项到标记的多对多关系。在

简单的add没有问题(在适当的表中插入项和标记),但是如果我添加另一个具有相同标记名的项,它将创建一组重复的标记名,而不是仅仅将关联表链接到现有的标记项。在

我发现有些情况与我的要求非常接近,但并不完全相同,我真的很难理解实现这一目标的最佳方式。在

因此,问题是:在标记表中只有唯一的条目,同时仍然正确地将标记与条目表关联起来的最佳方法是什么?在

感谢您的帮助/指导!在

以下是我的模型:

items_tags = db.Table('items_tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('item_id', db.Integer, db.ForeignKey('item.id'))
)

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), unique=False)
    code = db.Column(db.String(), unique=False)
    notes = db.Column(db.String(), unique=False)

    tags = db.relationship('Tag', secondary=items_tags, back_populates="items")

    def json(self):
        list_tag = []
        for tag in self.tags:
            list_tag.append({"tag": tag.name, "id": tag.id })
        return json.loads(json.dumps({"id": self.id, "title": self.title, "code": self.code, "notes": self.notes, "tags" : list_tag }))

    def __init__(self, title, code, notes, tags):
        self.title = title
        self.code = code
        self.notes = notes        
        self.tags = tags

    def __repr__(self):
        return self.title

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

    items = db.relationship('Item', secondary=items_tags, back_populates="tags")

    def json(self):
        return {'id': self.id, 'tag': self.name}

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return self.name

这里是控制器:

^{pr2}$

Tags: namein标记selfiddbtitledef
1条回答
网友
1楼 · 发布于 2024-05-19 01:44:44

我忽略了这样一个事实:我需要先查询标记是否存在(@dirn通过“更改如何加载现有记录”来达到的目的)。在

以下是我所做的,以确保没有添加重复标记:

if request.method == 'POST':
    if 'tags' in request.json:
        list_tags = []
        for tag in request.json['tags']:
            if Tag.query.filter_by(name=tag['tag']).first():
                list_tags.append(Tag.query.filter_by(name=tag['tag']).first())
            else:
                list_tags.append(Tag(tag['tag']))

    item = Item(request.json['title'], request.json['code'], request.json['notes'], list_tags)
    db.session.merge(item)
    db.session.commit()
    return jsonify({}), 201

相关问题 更多 >

    热门问题