我有两个模型(sett
,data_parsed
),并且data_parsed
有一个到sett
的外键。你知道吗
class sett(models.Model):
setid = models.IntegerField(primary_key=True)
block = models.ForeignKey(mapt, related_name='sett_block')
username = models.ForeignKey(mapt, related_name='sett_username')
ts = models.IntegerField()
def __unicode__(self):
return str(self.setid)
class data_parsed(models.Model):
setid = models.ForeignKey(sett, related_name='data_parsed_setid', primary_key=True)
block = models.CharField(max_length=2000)
username = models.CharField(max_length=2000)
time = models.IntegerField()
def __unicode__(self):
return str(self.setid)
data_parsed
模型应该有相同数量的行,但是它们可能不在“同步”中。你知道吗
为了避免这种情况发生。我基本上要做两个步骤:
检查sett.objects.all().count()
==data_parsed.objects.all().count()
这对于快速检查非常有效,而且在一百万行中需要几秒钟的时间。
如果它们不相同,我将检查所有sett
模型的pk,排除已经在data_parsed
中找到的pk。你知道吗
sett.objects.select_related().exclude(
setid__in = data_parsed.objects.all().values_list('setid', flat=True)).iterator():
基本上,这是选择sett中的所有对象,排除已解析数据中的所有setid。这种方法“有效”,但100万行大约需要4个小时。
有没有更快的方法?你知道吗
如果我没弄错的话,你是在试图通过设置外键来保存另一个模型中已处理对象的列表。你知道吗
每个sett对象只解析一个数据对象,因此不需要多对一关系。可以使用one to one relationships,然后检查哪个对象的字段为空。你知道吗
对于外键,您可以尝试使用反向查询进行过滤,但这是在对象级别,因此我怀疑这是否有效。你知道吗
查找没有使用反向关系解析数据的集合:
相关问题 更多 >
编程相关推荐