如何在django中正确使用auto_created属性?

Rap*_*ael 10 python django many-to-many django-models

我需要创建自己的中间模型.

class class1(models.Model)

class class2(models.Model):
    field1 = models.ManyToManyField(class1, through="class3")

class class3(models.Model):
    field1 = models.ForeignKey(class1)
    field2 = models.ForeignKey(class2)
    field3 = models.IntegerField()

    class Meta:
        auto_created = True
Run Code Online (Sandbox Code Playgroud)

我使用"auto_created = True",因为在下面的代码中,我有错误:

AttributeError:不能在指定中间模型的ManyToManyField上使用add().

for m2m_field in self._meta.many_to_many:
    for m2m_link in getattr(self, m2m_field.get_attname()).all():
        getattr(to_object, m2m_field.get_attname()).add(m2m_link)
Run Code Online (Sandbox Code Playgroud)

现在它工作正常,但是当我尝试进行makemigration时,django想要删除我的class3(中间类),并删除class2中field1中的"through"属性.

我究竟做错了什么 ?有解决方案吗

Tks all.

Ala*_*air 13

据我所知,类中的auto_created属性Meta没有记录,所以你应该避免使用它.

如上所述AttributeError,不可能用于使用add()中间模型的多对多领域.正确的解决方法是创建中间模型的实例,而不是使用add().

class3.objects.create(field_1=c1, field_2=c2, field_3=1).
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅多对多关系中额外字段的文档.

  • @Raphael在迁移中,`auto_created`模型由`ManyToManyField`的`AddField`操作创建 - 它不作为单独的模型存在,仅作为定义m2m字段的模型的一部分.由于迁移生成器不再在模型注册表中看到模型,因此它将尝试删除它.您不能(还)从具有显式模型的m2m更改为自动创建的模型,或者相反. (2认同)