peewee manytomany-贯穿表的对象a id和对象b id导致完整性错误

问题描述 投票:0回答:1

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

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

如果上面的路径的ID为1,并且我正在存储具有唯一约束的标签,则希望在穿透表中执行以下操作:

  • 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分别是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)
python many-to-many peewee data-integrity
1个回答
0
投票

多对多字段假定构成该关系的两个外键是唯一的。如果查看源代码,您会发现直通表中的两个fks有唯一的约束。您的示例很奇怪,因为您不是在谈论一组关系,而是出于某种疯狂的原因(标记)已归一化为单独表的事物的顺序。简而言之,这一切都是过度设计的。

如果您坚持使用此架构,则在没有唯一约束的情况下显式创建穿透表。您可能想添加第三列以指定顺序,因为在您的示例中这似乎很有意义。

而且您的代码效率低下。只要做:

path_obj = Path.create(name='my_path')
path_obj.tags.add(my_path)
© www.soinside.com 2019 - 2024. All rights reserved.