AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'
AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'
我正在尝试将项目经理分配给员工。
每个员工,都可以是项目经理。
项目经理可以有多个员工。
员工只能有 1 个项目经理。
但是当我这样做时 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
以确保每个员工只能有一个项目经理。
我正在尝试将项目经理分配给员工。
每个员工,都可以是项目经理。
项目经理可以有多个员工。
员工只能有 1 个项目经理。
但是当我这样做时 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
以确保每个员工只能有一个项目经理。