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:
中包含以下内容
- path_id | tag_id
- 1______ 1
- 1______ 1
- 1______ 1
- 1______ 1
- 1______ 1
- 1______ 2
- 1______ 3
- 1______ 4
其中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)
多对多字段假定构成关系的两个外键是唯一的。如果您查看源代码,您会发现直通 table 中的两个 fk 存在唯一约束。您的示例很奇怪,因为您不是在谈论一组关系,而是出于某些疯狂的原因(标签)将您标准化为单独的 table 的事物的排序。简而言之,这一切都被过度设计了。
如果您坚持使用此模式,则通过 table 显式创建没有唯一约束的模式。您可能想添加第三列来指定顺序,因为它在您的示例中似乎很有意义。
你的代码也很低效。只是做:
path_obj = Path.create(name='my_path')
path_obj.tags.add(my_path)
我正在尝试使用多对多关系将路径中的标签保存到直通table,其中路径是标签列表,其中标签可能重复,如下所示:
path = ['div', 'div', 'div', 'div', 'div', 'ul', 'li', 'a']
如果上述路径的 ID 为 1,并且我正在存储具有唯一约束的标签,我希望在 through-table:
中包含以下内容- path_id | tag_id
- 1______ 1
- 1______ 1
- 1______ 1
- 1______ 1
- 1______ 1
- 1______ 2
- 1______ 3
- 1______ 4
其中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)
多对多字段假定构成关系的两个外键是唯一的。如果您查看源代码,您会发现直通 table 中的两个 fk 存在唯一约束。您的示例很奇怪,因为您不是在谈论一组关系,而是出于某些疯狂的原因(标签)将您标准化为单独的 table 的事物的排序。简而言之,这一切都被过度设计了。
如果您坚持使用此模式,则通过 table 显式创建没有唯一约束的模式。您可能想添加第三列来指定顺序,因为它在您的示例中似乎很有意义。
你的代码也很低效。只是做:
path_obj = Path.create(name='my_path')
path_obj.tags.add(my_path)