【问题标题】:add() for ManyToManyField which specifies an intermediary model指定中间模型的 ManyToManyField 的 add()
【发布时间】:2014-05-22 18:24:53
【问题描述】:

关于这个异常有很多问题:

AttributeError: Cannot set values on a ManyToManyField which specifies 
an intermediary model.
Use myapp.MyThroughModel's Manager instead.

docs

你不能只在一个人和一个组之间建立关系—— 您需要指定所需关系的所有详细信息 会员模型。简单的添加、创建和分配调用 不提供指定此额外细节的方法。结果,他们 对于使用中间体的多对多关系被禁用 型号。

但我的 MyThroughModel 的所有属性/列都是可选的。经理可以创建它们。

如何编写自定义管理器来自动创建 MyThroughModel 实例?

我需要 ORM 级别的解决方案,而不是表单级别的解决方案。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我找到了一种方法来告诉 django 忽略多余的数据:

    class MyThroughModel(Model):
        class Meta():
            auto_created=True
        ...
    

    更新

    这会导致 django 内部迁移出现问题。我们更新了代码,不再使用auto_created = True

    【讨论】:

    • 对我来说,这个解决方案会破坏迁移。 makemigrations 想要删除带有此选项集的直通模型。
    • @RobinElvin 你用的是哪个版本的 django?
    • 那你现在做什么?
    • 我重构了它。 MyThroughModel 已被删除,相关类现在使用普通的 ManyToManyField。我们不需要中介模型。这是一个设计错误。
    • auto_create=True 如果您有旧版数据库(您别无选择,只能使用 through_model)并且表是“非托管”(无迁移),则可能会起作用。只要中间表没有额外的字段或所有字段都有默认值。这个解决方案有点小技巧,但它可能会节省大量手动保存和更新 M2M 关系所需的复杂代码。
    猜你喜欢
    • 2016-01-12
    • 2018-11-12
    • 2017-11-29
    • 2016-12-08
    • 2016-11-15
    • 2011-03-06
    • 2011-11-25
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多