【问题标题】:AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'AttributeError:“ManyToManyField”对象没有属性“_m2m_reverse_name_cache”
【发布时间】:2015-11-10 04:31:23
【问题描述】:

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

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

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

  • 员工只能有 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

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

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

    我尝试按照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 之类的名称,以确保每个员工只能有一个项目经理。

    【讨论】:

    • 你能告诉我如何制作一把火钥匙,让每个员工只有一个下午吗?
    • to_employee = models.ManyToMany()- 我正在使用,因为在 forms.py 中我可以将多个员工分配给 PM。如果我将to_employee 更改为使用 ForeignKey,那么我只能将一名员工分配给 PM。
    • 如果你从员工项目经理分配,那么每个员工只能有一个PM,但每个PM可以有很多员工。只需在 Employee 中创建一个外键字段
    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 2012-12-01
    • 2021-04-19
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多