Django中的orm在处理外键时,会将外键指向的类lower并拼接一个"_set"来找出该外键对象的set集。举个例子。

class Poi(models.Model):
    name = models.CharField(max_length=14,null=True)
class TravelPlan(models.Model):
    startPoi = models.ForeignKey("Poi",null=True,on_delete=models.SET_NULL)

这样当通过Poi来获取所有相关的TravelPlan时,可以通过以下代码

p = Poi.objects.get(id=1)
p.travelplan_set.all()

但是如果TravelPlan中有两个Poi外链时,p.travelplan_set无法对应是哪一个,如下

class TravelPlan(models.Model):
    startPoi = models.ForeignKey("Poi",null=True,on_delete=models.SET_NULL)
    endPoi = models.ForeignKey("Poi",null=True,on_delete=models.SET_NULL)

所以需要在设置外链时给一个related_name,使用来代替默认规则自动生成的"_set"

class TravelPlan(models.Model):
    startPoi = models.ForeignKey("Poi",null=True,on_delete=models.SET_NULL,related_name="startpoi")
    endPoi = models.ForeignKey("Poi",null=True,on_delete=models.SET_NULL,related_name="endpoi")

使用时

p = Poi.objects.get(id=1)
p.startpoi.all()
p.endpoi.all()

标签: django, restframework, orm

添加新评论