如何在django中实现同步标记

时间:2009-08-26 13:15:30

标签: django orm django-models

我们正在通过紧密链接(7kb)在一个主数据库和许多从数据库之间建立同步。 为了最大限度地减少数据发送量,我们标记了每个成功发送的记录。

为此,我们创建了以下模型:

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对象。

1 个答案:

答案 0 :(得分:0)

使用queryset.model._meta.pk.name获取主键字段的名称。

您可能还会发现._meta.db_table有用。

当然,这个使用的非官方API,不能保证在未来的django版本中兼容,但是如果你有一些单元测试你应该没问题。