2014-09-10 3 views
1

외래 키를 공유하는 피쳐 모델의 인스턴스에 ID가 있어야합니다. 새 기능을 만들 때 해당 ID를 자동으로 증가시킵니다. 데이터베이스의 기능을 테이블에서이 인쇄를 살펴 경우Django - 외래 키와 관련된 기본 키 필드

enter image description here

각 기능은 외부 키 (shapefile_id)가 같은 shapefile_id을 공유하는 사람들, 그들은 (id_relat) 고유 ID를 가지고

나는 내가 지금까지 발견 한 것보다이 처리하는 더 나은 방법이 있는지 알고 싶습니다 : 내가이처럼 해달라고

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 

, 그것을 얻기 위해 모든 기능을 조회 할 필요가 있어요 th에서 가장 높은 id_relat e cal_id_relat 메소드.

+0

PositiveIntegerField 대신 AutoField를 사용해보세요. –

+0

정말 id_relat 필드를 사용해야합니까? 모든 모델에는 양수, 정수 및 100 % 고유 한 필드 ID가 있습니다. –

+0

id_relat은 동일한 shapefile 외래 키를 공유하는 기능에 고유하고 고유 한 ID입니다. 외래 키가 다른 경우 두 기능은 동일한 id_relat을 가질 수 있습니다. –

답변

1

Django 응용 프로그램이> 1 스레드에서 실행될 수 있으므로 접근 방법이 잠재적으로 위험 할 수 있습니다. cal_id_relat는 동시에 호출 될 수 있으며 모든 호출에 대해 동일한 ID를 반환합니다.