我正在尝试使用多对多关系将路径内的标记保存到通过表的路径,其中路径是标记的列表,其中标记可能是重复的,如下所示:
path = ['div', 'div', 'div', 'div', 'div', 'ul', 'li', 'a']
如果上面的路径的ID为1,并且我正在存储具有唯一约束的标签,则希望在穿透表中执行以下操作:
[tag_id的1,2,3和4分别是div
,ul
,li
和a
。
但是,出现以下错误:
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)
多对多字段假定构成该关系的两个外键是唯一的。如果查看源代码,您会发现直通表中的两个fks有唯一的约束。您的示例很奇怪,因为您不是在谈论一组关系,而是出于某种疯狂的原因(标记)已归一化为单独表的事物的顺序。简而言之,这一切都是过度设计的。
如果您坚持使用此架构,则在没有唯一约束的情况下显式创建穿透表。您可能想添加第三列以指定顺序,因为在您的示例中这似乎很有意义。
而且您的代码效率低下。只要做:
path_obj = Path.create(name='my_path')
path_obj.tags.add(my_path)