긴밀한 링크 (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 개체를 반환해야합니다.
나는 틀린 필드 이름을 얻고있다 :(일대일 관계에 대해 나는 base_profile.user_ptr_id 대신 base_profile.user_ptr을 얻고있다. –
나는 그것이 pk.column이어야 함을 발견했다. –