Django - 如果主键匹配,则检查两个模型

时间:2014-09-26 16:25:49

标签: python django

我有2个模型(settdata_parsed),而data_parsedsett的外键。

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模型应该具有相同的行数,但它们可能不是“同步”。

避免这种情况发生。我基本上做了这两个步骤:

  1. 检查sett.objects.all().count() == data_parsed.objects.all().count()

    这对于快速检查非常有用,并且在100万行中需要几秒钟。

  2. 如果它们不相同,我会检查所有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个小时。

  3. 有更快的方法吗?

2 个答案:

答案 0 :(得分:3)

使用反向关系查找没有data_parsed的setts:

setts.objects.filter(data_parsed_setid__isnull=True)

答案 1 :(得分:1)

如果我做得对,你试图通过设置外键来保持另一个模型中的已处理对象列表。

每个设置对象只有一个data_parsed对象,因此不需要多对一关系。您可以使用one to one relationships,然后检查哪个对象将该字段设为空。

使用外键,您可以尝试使用反向查询进行过滤,但这是在对象级别,所以我怀疑是否有效。