AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'

AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'

我正在尝试将项目经理分配给员工。

但是当我这样做时 Employee.objects.get(name='HereHere').get_xxx()

我得到了AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'

class Employee(models.Model):
    name = models.CharField(max_length=20, unique=True)
    pm = models.ManyToManyField('self', symmetrical=False, through='PM', related_name='related_to', )

    def add_pm(self, employee, ):
        pm, created = PM.objects.get_or_create(from_employee=self, to_employee__in=employee,)
        return pm

    def remove_pm(self, employee, ):
        PM.objects.filter(
            from_employee=self,
            to_employee=employee,
        ).delete()
        return

    def get_relationships(self, ):
        return self.pm.filter(
            to_employee__from_employee=self)   #<----- AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'

    def get_related_to(self,):
        return self.related_to.filter(
            from_employee__to_employee=self)    #<----- AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'


    def __str__(self):
        return '%s' % self.name


class PM(models.Model):
    from_employee = models.ForeignKey(Employee, related_name='from_employee')
    to_employee = models.ManyToManyField(Employee, related_name='to_employee') #<----- This cause the problem

我用你上面的代码制作了一个应用程序并设法重现了这个问题。

我尝试按照建议 here 将 'self' 切换到 'Employee' 并尝试在现场调整其他一些东西(比如 on_delete=models.CASCADE),但仍然实例化了一个 Employee对象并在其上调用 .pm 引发错误。

我认为 django 对你可以使用什么 类 作为 ManyToMany 的 through 参数有期望,它必须有两个外键,而不是一个外键和一个 ManyToMany。

所以...

如果你切换到这个:

class PM(models.Model):
    from_employee = models.ForeignKey(Employee, related_name='from_employee')
    to_employee = models.ForeignKey(Employee, related_name='to_employee')

有效。这实际上是多对多关系的正常模式——每个 PM 代表一个项目经理关系,而不是一个人。

或者,

您可以将项目经理作为从员工到员工的外键,命名为 managed_by 以确保每个员工只能有一个项目经理。