AttributeError:'ManyToManyField'对象没有属性'_m2m_reverse_name_cache' [英] AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'

查看:897
本文介绍了AttributeError:'ManyToManyField'对象没有属性'_m2m_reverse_name_cache'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




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

    >

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


  • 员工只能有1个项目经理。 p>




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



我得到 AttributeError:'ManyToManyField'对象没有属性'_m2m_reverse_name_cache'

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

def add_pm ,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'对象没有属性'_m2m_reverse_name_cache'

def get_related_to (self,):
return self.related_to.filter(
from_employee__to_employee = self)#< ----- AttributeError:'ManyToManyField'对象没有属性'_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')#< -----这导致问题


解我做了一个你上面代码的应用程序,并设法重新创建了这个问题。



我尝试将'self'切换成'Employee'为建议此处,并尝试调整其他一些事情(像 on_delete = models.CASCADE ),但仍然实例化一个Employee对象,并调用 .pm 这个错误。



我认为django对于您可以通过通过参数为ManyToMany而使用什么类别的期望,以及它必须有两个外键,而不是一个外键和一个ManyToMany。



所以...



如果你切换到这个:

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

它的作品。这实际上是ManyToMany关系的正常模式 - 每个PM代表项目经理关系,而不是一个人。



或者, h2>

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


I'm trying to assign Project Manager to Employee.

  • Every Employee, can be Project Manager.

  • Project Managers can have multiple Employees.

  • Employees can have only 1 Project Manager.

But When I do Employee.objects.get(name='HereHere').get_xxx()

I got 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

解决方案

I made an app with your code above and managed to recreate the issue.

I tried switching 'self' to 'Employee' as suggested here and tried tweaking a couple other things (like on_delete=models.CASCADE) in the field, but still instantiating an Employee object and calling .pm on it threw the error.

I think django has expectations about what classes you can use as the through parameter for a ManyToMany and it has to have two foreign keys, not a foreign key and a ManyToMany.

So...

If you switch to this:

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

it works. And that's actually the normal pattern for ManyToMany relationships anyways -- each PM represents a Project Manager relationship, not a person.

Alternatively,

You could have project manager be a foreign key from Employee to Employee, named something like managed_by to make sure each employee can only have one project manager.

这篇关于AttributeError:'ManyToManyField'对象没有属性'_m2m_reverse_name_cache'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆