2009-08-26 1 views
0

긴밀한 링크 (7kb)를 통해 하나의 마스터 데이터베이스와 많은 슬레이브 데이터베이스를 동기화합니다. 데이터 전송량을 최소화하기 위해 성공적으로 전송 된 각 레코드에 태그를 지정합니다.django에서 동기화 태그를 구현하는 방법

class SynchronizationTag(models.Model): 
    STATUSES = ((0, "Invalid"), 
       (1, "Pending"), 
       (2, "Synchronized"), 
       ) 
    status = models.IntegerField(choices=STATUSES, default = 1) 
    storage = models.ForeignKey("Storage") 

    _content_type = models.ForeignKey(ContentType) 
    _object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('_content_type', '_object_id') 

class Storage(models.Model): 
    id = models.AutoField(primary_key=True) 

우리가 쿼리 세트에서 동기화로 태그 된 기록을 필터링 할 일반적인 쿼리를 작성 동기화를 필요 레코드를 선택하려면 다음을 수행하려면

그래서 우리는 다음과 같은 모델을 만들었습니다.

우리는 다음과 같은 차선의 해결책을했다 :

delta = queryset.extra(
    select={ 
     "status" : ("SELECT status FROM rv3adapter_synchronizationtag " 
        "WHERE `_content_type_id` = %d and `_object_id`= %s.id and `storage_id` = %d" 
        % (content_type.pk, table, storage.pk)) 
     }, 
    where=["`status` <> 2 or `status` is NULL") 

우리라는 이름의 ID를 기본 키가없는 몇 가지 모델을 가지고 위의 지금 깨지는 쿼리.

위 쿼리를 개선/수정하는 방법을 알고 계십니까?

참고 : 쿼리는 django 개체를 반환해야합니다.

답변

0

queryset.model._meta.pk.name으로 기본 키 필드의 이름을 가져옵니다.

._meta.db_table이 유용 할 수도 있습니다.

이은 입니다. 장래 버전의 django에서 호환되지 않을 수있는 비공식 API를 사용하고 있지만 몇 가지 단위 테스트가 있으면 잘해야합니다.

+0

나는 틀린 필드 이름을 얻고있다 :(일대일 관계에 대해 나는 base_profile.user_ptr_id 대신 base_profile.user_ptr을 얻고있다. –

+0

나는 그것이 pk.column이어야 함을 발견했다. –