2014-09-10 81 views
1

我希望共享外键的Feature模型的实例具有ID。当创建新功能时,我想自动递增该ID。Django - 与外键相关的主键字段

enter image description here

如果你看看从数据库中的功能表这个打印,每个功能都有一个外键(shapefile_id)和那些谁共享相同的shapefile_id,他们有一个唯一的ID(id_relat)

我想知道是否有更好的方式来处理这个问题比我迄今发现:

class Shapefile(models.Model): 
    filename = models.CharField(max_length=255) 


class Feature(models.Model): 
    shapefile = models.ForeignKey(Shapefile) 
    id_relat = models.PositiveIntegerField(db_index=True) 

    def Meta(self): 
     unique_together = (("shapefile", "id_relat"),) 

    def save(self, *args, **kwargs): 
     if not self.id_relat: #assign incremented id only to new feature 
      self.id_relat = cal_id_relat(self.shapefile) 
     super(Feature, self).save(*args, **kwargs) 

def cal_id_relat(shapefile): 
    ids_relat = Feature.objects.filter(shapefile=shapefile).order_by('-id_relat').values_list('id_relat',flat=True) 
    if ids_relat: 
     return ids_relat[0]+1 
    else: 
     return 0 

我不喜欢这个,这是有必要查询所有的功能来获得最高的id_relat在th e cal_id_relat方法。

+0

尝试将AutoField改为PositiveIntegerField。 – 2014-09-10 18:19:50

+0

你真的需要使用id_relat字段吗?每个模型都有字段ID,它是正数,整数和100%唯一。 – 2014-09-10 20:08:04

+0

id_relat是一个id,它是共享相同shapefile外键的特性的唯一标识。如果外键不同,两个特征可以具有相同的id_relat – 2014-09-11 12:23:06

回答

1

您的Django应用程序可以在> 1个线程中执行,因此您的方法有潜在危险。 cal_id_relat可以被同时调用并且将为所有调用返回相同的ID。