当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在django中正确使用auto_created属性?》经验,为你挑选了1个好方法。

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

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

我使用"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)

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

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

Tks all.



1> Alasdair..:

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

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

class3.objects.create(field_1=c1, field_2=c2, field_3=1).

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


@Raphael在迁移中,`auto_created`模型由`ManyToManyField`的`AddField`操作创建 - 它不作为单独的模型存在,仅作为定义m2m字段的模型的一部分.由于迁移生成器不再在模型注册表中看到模型,因此它将尝试删除它.您不能(还)从具有显式模型的m2m更改为自动创建的模型,或者相反.
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有