与“通过”模型的多对多关系在迁移时返回错误

时间:2017-12-05 07:33:36

标签: django django-models django-views

我正在尝试实现一个允许两个Profile模型对象成为Pair模型对象的一部分的系统。

以下是配置文件,后面是配对模型:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE,
                                null=True, blank=True)
    pair = models.ManyToManyField('self', through='Pair',
                                   symmetrical=False,
                                   related_name='pair_to+')

class Pair(models.Model):
    requester = models.ForeignKey(Profile, related_name='pairing_requester')
    accepter = models.ForeignKey(Profile, related_name='pairing_accepter')
    requester_learns = models.CharField(max_length=60, null=True)
    requester_teaches = models.CharField(max_length=60, null=True)  

配置文件之间的关系应该是对称的,这样(profile1,profile2)是一个唯一的对象,我不应该期望创建(profile2,profile1)。

所以,根据this article,我正试图建立这种关系。

makemigrations后,我收到错误:

ERRORS:
<function ManyToManyField.contribute_to_class.<locals>.resolve_through_model at 0x1044b47b8>: (models.E022) <function ManyToManyField.contribute_to_class.<locals>.resolve_through_model at 0x1044b47b8> contains a lazy reference to user_profile.pair, but app 'user_profile' doesn't provide model 'pair'.
user_profile.Profile.pair: (fields.E331) Field specifies a many-to-many relation through model 'Pair', which has not been installed.

我做错了什么?

1 个答案:

答案 0 :(得分:1)

class Pair(models.Model):
    requester = models.ForeignKey(Profile, related_name='pairing_requester')
    accepter = models.ForeignKey(Profile, related_name='pairing_accepter')
    requester_learns = models.CharField(max_length=60, null=True)
    requester_teaches = models.CharField(max_length=60, null=True)  

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE,
                                null=True, blank=True)
    pair = models.ManyToManyField('self', through='Pair',
                                   symmetrical=False,
                                   related_name='pair_to+')

你做错了的事情是你需要在调用与另一个模型的关系之前提及模型,django将首先创建PAIR模型然后将模型安装到另一个模型。所以使用它并在迁移之前删除旧的迁移文件