当前位置: 主页 > 日志 > Django >

Django如何创建指向同一个模型的多个外键?

如下所示的House模型,其”province“, "city"和"district"字段类型是指向Region模型的外键。

class Region(models.Model):
    """行政区域表
    国家,省,市,区(县)
    """
    parent = models.ForeignKey('self')
    name = models.CharField(max_length=30)
    region_type = models.IntegerField()

    class Meta:
        db_table = "regions"
        
class House(models.Model):
    """房屋表
    """
    province = models.ForeignKey(Region)
    city = models.ForeignKey(Region)
    district = models.ForeignKey(Region)
    address = models.CharField(max_length=200)
    name = models.CharField(max_length=200)
    longitude = models.FloatField() # 经度
    latitude = models.FloatField() # 纬度
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True, null=True) 

表面上看起来好像没有问题,但是进行syncdb时,就会出现”house.house: Accessor for field 'province' clashes with related field 'Region.house_set'. Add a related_name argument to the definition for 'province'....“错误。

原因是指向同一模型的三个外键反向关联名称产生了冲突,Region模型对province的反向关联名称为house_set(),对city的反向关联名称也是house_set(),对district的反向关联名称还是house_set()。

解决方法:给models.ForeignKey()加入related_name参数,定义不同的关联名称。如下代码:

class House(models.Model):
    """房屋表
    """
    province = models.ForeignKey(Region, related_name='province_houses')
    city = models.ForeignKey(Region, related_name='city_houses')
    district = models.ForeignKey(Region, related_name='district_houses')
    address = models.CharField(max_length=200)
    name = models.CharField(max_length=200)
    longitude = models.FloatField() # 经度
    latitude = models.FloatField() # 纬度
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True, null=True) 

 

参考文章:Relating a model to another model more than once

[日志信息]

该日志于 2012-06-15 00:32 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “Django如何创建指向同一个模型的多个外键?” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部