user1157751
user1157751

Reputation: 2457

Django - Checking for two models if their primary keys match

I have 2 models (sett, data_parsed), and data_parsed have a foreign key to 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)

The data_parsed model should have the same amount of rows, but there is a possibility that they are not in "sync".

To avoid this from happening. I basically do these two steps:

  1. Check if sett.objects.all().count() == data_parsed.objects.all().count()

    This works great for a fast check, and it takes literally seconds in 1 million rows.

  2. If they are not the same, I would check for all the sett model's pk, exclude the ones already found in data_parsed.

    sett.objects.select_related().exclude(
    setid__in = data_parsed.objects.all().values_list('setid', flat=True)).iterator():
    

    Basically what this does is select all the objects in sett that exclude all the setid already in data_parsed. This method "works", but it will take around 4 hours for 1 million rows.

Is there a faster way to do this?

Upvotes: 0

Views: 165

Answers (2)

Todor
Todor

Reputation: 16010

Finding setts without data_parsed using the reverse relation:

setts.objects.filter(data_parsed_setid__isnull=True)

Upvotes: 3

cdvv7788
cdvv7788

Reputation: 2089

If i am getting it right you are trying to keep a list of processed objects in another model by setting a foreign key.

You have only one data_parsed object by every sett object, so a many to one relationship is not needed. You could use one to one relationships and then check which object has that field as empty.

With a foreign key you could try to filter using the reverse query but that is at object level so i doubt that works.

Upvotes: 1

Related Questions