2014-09-10 65 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。