【问题标题】:Django related_name not found找不到 Django 相关名称
【发布时间】:2017-02-04 12:54:11
【问题描述】:

我有这个模型:

class Person(models.Model):
    something ...
    employers = models.ManyToManyField('self', blank=True, related_name='employees')

当我执行person.employees.all() 时,我收到此错误:'Person' object has no attribute 'employees'。是否仅在存在实际链接时才创建相关名称。如果是,我该如何检查?

编辑:我知道hasattr() 函数。我仍然想知道为什么没有相关对象时属性不返回空列表。

【问题讨论】:

    标签: python django orm


    【解决方案1】:

    要将related_name 与递归多对多一起使用,您需要设置symmetrical=False。没有它,Django 将不会在类中添加 employees 属性。来自docs

    当 Django 处理这个模型时,它识别出它本身有一个 ManyToManyField,因此,它没有将 person_set 属性添加到 Person 类。相反,ManyToManyField 被假定为对称的——也就是说,如果我是你的朋友,那么你就是我的朋友。

    所以你可以在字段中添加symmetrical=False

    employers = models.ManyToManyField('self', blank=True, related_name='employees', symmetrical=False)
    
    person.employees.all() # will work now
    

    或者只使用employers属性:

    person.employers.all()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2020-01-11
      • 2021-01-24
      • 2022-07-15
      • 2019-01-29
      • 2012-10-19
      相关资源
      最近更新 更多