【问题标题】:How to add ManyToMany field with 'through' relation to fixtures?如何将具有“通过”关系的多对多字段添加到固定装置?
【发布时间】:2020-05-04 10:36:19
【问题描述】:

在测试(夹具)中,我想添加具有“通过”关系的 ManyToMany 字段的字段,即

my_field = models.ManyToManyField(SomeModel, through=AnotherModel).

尝试像常规的 ManyToManyField 一样添加:

object.my_field.add(my_field)

但它给了我这个警告信息:enter image description here

另外,试过这个:

object.my_field.add(my_field, through_defaults=AnotherModel)

也没有用

【问题讨论】:

    标签: django django-models pytest fixtures pytest-django


    【解决方案1】:

    你只需构造一个AnotherModel 对象,所以:

    AnotherModel.objects<b>.create(firstmodel=object, somemodel=myfield)</b>

    如果AnotherModel 包含没有默认值的额外字段,您也需要指定这些字段。

    或者您可以使用.add(..) [Django-doc],其中through_defaults 应该包含一个字典,其中包含要传递给AnotherModel 的值:

    object.my_field.add(my_field<b>, through_defaults={'field1': 14, 'field2': 25}</b>)

    有关through_defaults 的更多信息,请参阅Extra fields on many-to-many relationships section of the documentation。这包含一个类似的例子:

    beatles.members.set([john, paul, ringo, george], <b>through_defaults={'date_joined': date(1960, 8, 1)}</b>)

    在此示例中,beatles 对象的members 是具有中间模型的ManyToManyField,这里我们将date(1960, 8, 1) 填写为该模型中date_joined 的值。

    【讨论】:

    • @DinaNasyrkhan:ManyToManyField 只不过是一个模型,它有两个 ForeignKeys 到它链接的模型。如果你自己没有指定 through 模型,Django 会自动创建一个。如果你在窗帘后面使用.add(),它会创建一个AnotherModel,所以添加一个额外的fixture确实没有多大用处。
    • 看我有这个:restaurant.contract.add(contract, through_defaults=restaurant_contract),这里的 restaurant_contract 是另一个夹具(使用 AnotherModel.objects.create(firstmodel=object, somemodel=myfield))。这仍然给我一个错误。也试过了:restaurant.contract.add(contract, through_defaults={'restaurant'=restaurant, 'contract'=contract}),还是不行
    • 另外,如果我没有添加额外的 fileld 并像 restaurant.contract.add(contract) 一样离开,它会说它不正确(上面的警告消息)。有什么解决办法吗?
    • @DinaNasyrkhan:好吧,我在 [.add(..)](github.com/django/django/blob/…) 的实现中找不到该错误消息,也许您使用了一些信号、其他插件等来阻止这种情况。但我设法重现添加关系对象。
    • @DinaNasyrkhan:你有没有机会使用旧版本的 Django?在 2.2 之前,对于具有 through 模型的 m2m 字段使用 .add(..) 是不可能的 iirc。
    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多