Home > other >  Joinging Query Django
Joinging Query Django

Time:02-15

class PopSummary(models.Model):

available_pop = models.PositiveIntegerField(default=0)
email = models.EmailField(
    verbose_name="email address",
    max_length=255,
    unique=True,
    default=''
)     

requested_pop = models.PositiveIntegerField(default=0)  
approved_pop = models.PositiveIntegerField(default=0)  
created_at = models.DateTimeField(auto_now_add=True)
approve = models.BooleanField(default=False)

popuser = models.ForeignKey(RequestPop, on_delete=models.CASCADE,related_name='popuser',null=True)


def __str__(self):
    return "{}-{}".format(self.email,self.available_pop)  

Another Table:

class RequestPop(models.Model):

request_pop = models.PositiveIntegerField(default=0)
user = models.ForeignKey(
    settings.AUTH_USER_MODEL, on_delete=models.CASCADE,unique=False,null=True)

created_at = models.DateTimeField(auto_now_add=True)    
available_pop = models.PositiveIntegerField(default=0)

def __str__(self):

    return "{}-{}".format(self.user,self.request_pop)

I want to make the query in inner join or other way so that:

select all from RequestPop where PopSummary.approve=True

I run the follwing query.

queryset = RequestPop.objects.filter(popuser__approve=True).all()

but it seems to be incorrect. So what should be the solution for it please.

CodePudding user response:

It is incorrect as the RequestPop doesn't have a popuser attribute, you can go the other way round.

queryset = PopSummary.objects.filter(approve=True)
for obj in queryset
    reqpop=obj.popuser_set.all()

CodePudding user response:

First of all, I will suggest using Foreign keys instead of positive so that you can run queries in more pythonic ways

You can write this line as

requested_pop = model.ForeignKey(RequestPop,on_delete=models.CASCADE,null=True, related_name="pop_summaries")

Now you can write the query as below

request_pops = RequestPop.objects.filter(pop_summaries__approve=True)

This is exactly what you want to achieve.

So always try to use foreign keys instead of integer as reference so that Django can create join queries for them while writing in more pythonic way.

  • Related