AttributeError:“ManyToManyField”对象没有属性“_m2m_reverse_name_cache”

2024-05-12 14:04:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把项目经理分配给雇员。在

  • 每个员工,都可以当项目经理。

  • 项目经理可以有多个员工。

  • 员工只能有一名项目经理。

但当我这么做的时候

我得到了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

Tags: tonamefromselfreturnmodelsdef员工
1条回答
网友
1楼 · 发布于 2024-05-12 14:04:59

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

我尝试按照建议将“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')

它起作用了。这实际上是很多关系的正常模式,不管怎样,每个项目经理代表的是一个项目经理,而不是一个人。在

或者

您可以让项目经理成为员工之间的外键,命名为managed_by,以确保每个员工只能有一个项目经理。在

相关问题 更多 >