Django model 反向引用中的related_name

转:https://blog.****.net/lanyang123456/article/details/68962515

问题:

定义表Apple:

class Apple( models.Model):
    origin_level = models.ForeignKey(AppleLevel)
    new_level = models.ForeignKey(AppleLevel)
  • 1
  • 2
  • 3

出现如下问题:

monitor.apple: Accessor for field ‘origin_level’ clashes with related field ‘AppleLevel.apple_set’. Add a related_name argument to the definition for ‘origin_level’.
monitor.apple: Accessor for field ‘new_level’ clashes with related field ‘AppleLevel.apple_set’. Add a related_name argument to the definition for ‘new_level’.

原因:

一个数据表同时两次外键引用另一个表,出现重名问题。

解决办法:

使用related_name属性定义名称(related_name是关联对象反向引用描述符)。
具体修改代码如下:

class Apple( models.Model):
    origin_level = models.ForeignKey(AppleLevel, related_name='orgin_level_appleset')
    new_level = models.ForeignKey(AppleLevel, related_name='new_level_appleset')
  • 1
  • 2
  • 3

related_name使用之后,有什么用处呢?
用处就是:
通过AppleLevel可以得到引用自身的Apple对象。

例如,
通过origin_level引用AppleLevel 中id为12的Apple的所有对象

AppleLevel.object.get(id=12).origin_level_appleset.objects.all()
  • 1

通过new_level引用AppleLevel 中id为12的Apple的所有对象

AppleLevel.object.get(id=12).new_level_appleset.objects.all()
  • 1

参考:

http://www.cnblogs.com/blogofwyl/p/4283513.html