peewee manytomany - 对象 a id 和对象 b id 通过 table 导致完整性错误

peewee manytomany - object a id and object b id on through table causes integrity error

我正在尝试使用多对多关系将路径中的标签保存到直通table,其中路径是标签列表,其中标签可能重复,如下所示:

path = ['div', 'div', 'div', 'div', 'div', 'ul', 'li', 'a']

如果上述路径的 ID 为 1,并且我正在存储具有唯一约束的标签,我希望在 through-table:

中包含以下内容

其中tag_id的1、2、3、4分别为divullia

但是,我收到以下错误:

peewee.IntegrityError: UNIQUE constraint failed: path_tag_through.path_id, path_tag_through.tag_id

我到底做错了什么?我也无法设置unique=False

这里是要复制的代码:

import peewee
from peewee import *
db = SqliteDatabase('bs.db')

class BaseModel(Model):
    class Meta:
        database = db

class Tag(BaseModel):
    name = CharField()

class Path(BaseModel):
    name = CharField()
    tags = ManyToManyField(Tag, backref='path')

PathTags = Path.tags.get_through_model()

db.create_tables([
    Tag,
    Path,
    PathTags])

my_path = ['div', 'div', 'div', 'div', 'div', 'ul', 'li', 'a']

path_id = Path.insert(name='my_path').execute()

path_obj = Path.get(path_id)

for i in my_path:
    path_obj.tags.add(i)

多对多字段假定构成关系的两个外键是唯一的。如果您查看源代码,您会发现直通 table 中的两个 fk 存在唯一约束。您的示例很奇怪,因为您不是在谈论一组关系,而是出于某些疯狂的原因(标签)将您标准化为单独的 table 的事物的排序。简而言之,这一切都被过度设计了。

如果您坚持使用此模式,则通过 table 显式创建没有唯一约束的模式。您可能想添加第三列来指定顺序,因为它在您的示例中似乎很有意义。

你的代码也很低效。只是做:

path_obj = Path.create(name='my_path')
path_obj.tags.add(my_path)