我们正在通过紧密链接(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对象。
答案 0 :(得分:0)
使用queryset.model._meta.pk.name
获取主键字段的名称。
您可能还会发现._meta.db_table
有用。
当然,这个是使用的非官方API,不能保证在未来的django版本中兼容,但是如果你有一些单元测试你应该没问题。