我有2个模型(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()
这对于快速检查非常有用,并且在100万行中需要几秒钟。
如果它们不相同,我会检查所有sett
模型的pk,排除已在data_parsed
中找到的那些。
sett.objects.select_related().exclude(
setid__in = data_parsed.objects.all().values_list('setid', flat=True)).iterator():
基本上这样做是选择置顶中排除了data_parsed中所有setid的所有对象。这种方法“有效”,但100万行大约需要4个小时。
有更快的方法吗?
答案 0 :(得分:3)
使用反向关系查找没有data_parsed的setts:
setts.objects.filter(data_parsed_setid__isnull=True)
答案 1 :(得分:1)
如果我做得对,你试图通过设置外键来保持另一个模型中的已处理对象列表。
每个设置对象只有一个data_parsed对象,因此不需要多对一关系。您可以使用one to one relationships,然后检查哪个对象将该字段设为空。
使用外键,您可以尝试使用反向查询进行过滤,但这是在对象级别,所以我怀疑是否有效。