Django正在检查两个模型的主键是否匹配

2024-04-24 21:12:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个模型(settdata_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模型应该有相同数量的行,但是它们可能不在“同步”中。你知道吗

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

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

    这对于快速检查非常有效,而且在一百万行中需要几秒钟的时间。

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

有没有更快的方法?你知道吗


Tags: name模型selftruedataobjectsmodelsusername
2条回答

如果我没弄错的话,你是在试图通过设置外键来保存另一个模型中已处理对象的列表。你知道吗

每个sett对象只解析一个数据对象,因此不需要多对一关系。可以使用one to one relationships,然后检查哪个对象的字段为空。你知道吗

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

查找没有使用反向关系解析数据的集合:

setts.objects.filter(data_parsed_setid__isnull=True)

相关问题 更多 >