Django外键引用名冲突

时间:2017-09-12 05:57:09

标签: django

位置应用模型:

class States(models.Model):
    state_name = models.CharField(max_length=200, unique=True)
    update_time = models.DateTimeField(auto_now=True, auto_now_add=False)
    create_time = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self): 
        return self.state_name

class Districts(models.Model):
    state = models.ForeignKey(States, on_delete=models.CASCADE)
    dis_name = models.CharField(max_length=200, unique=True)
    update_time = models.DateTimeField(auto_now=True, auto_now_add=False)
    create_time = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self): 
        return self.dis_name

class Places(models.Model):
    district    =  models.ForeignKey(Districts, on_delete=models.CASCADE)
    place_name  =  models.CharField(max_length=200, unique=True,)
    pin_no      =  models.IntegerField(null=True)
    update_time =  models.DateTimeField(auto_now=True, auto_now_add=False)
    create_time =  models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self): 
        return self.place_name

假设,我想用区域名称映射一些信息。但在管理面板中,它显示所有地区名称。 (但冲突是两个州有相同的地区名称)

我想用这种方式: 工作的应用程序模型:

from location.models import States, Districts, Places
    class Info(models.Model):   
        dis_name    =  models.ForeignKey(Districts, on_delete=models.CASCADE)
        info_name   =  models.CharField(max_length=500)
        sort_name   =  models.CharField(max_length=50)
Admin.py中的

class InfoAdmin(admin.ModelAdmin):
    list_display = ("dis_name", "info_name", "sort_name")
    ordering = ('id',)

但在管理面板中,它会显示所有地区名称。

那我应该怎么做。避免冲突此外,如果我使用自己的ID,它会消除冲突。但在管理面板中,它只显示所有区域的所有id字段。这不是人类可读的。

示例:

我只想要,假设2个州有相同的地区名称说德里和加尔各答有相同的地区名称是大吉岭。然后在管理员面板2大吉岭显示。那么我怎么能确定哪个区域来自哪个州?

1 个答案:

答案 0 :(得分:0)

您在类中使 dis_name 成为唯一的。这将阻止您拥有多个同名的区域,即使它们处于不同的状态。

地方类中的 place_name 相同。

尝试:

class Districts(models.Model):
  state = models.ForeignKey(States, on_delete=models.CASCADE)
  dis_name = models.CharField(max_length=200, unique=False)
  update_time = models.DateTimeField(auto_now=True, auto_now_add=False)
  create_time = models.DateTimeField(auto_now=False, auto_now_add=True)

  def __str__(self): 
     return self.dis_name +' - '+ self.state.state_name

class Places(models.Model):
  district    =  models.ForeignKey(Districts, on_delete=models.CASCADE)
  place_name  =  models.CharField(max_length=200, unique=False)
  pin_no      =  models.IntegerField(null=True)
  update_time =  models.DateTimeField(auto_now=True, auto_now_add=False)
  create_time =  models.DateTimeField(auto_now=False, auto_now_add=True)

  def __str__(self): 
    return self.place_name + ' - ' + self.district.dis_name

更新:它现在将在管理面板中显示带有地区名称的相应州名, 和地名名称