Iqbal Hussain
Iqbal Hussain

Reputation: 1105

Joinging Query Django

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.

Upvotes: 0

Views: 41

Answers (2)

Umar Hayat
Umar Hayat

Reputation: 4991

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.

Upvotes: 0

Mohamed ElKalioby
Mohamed ElKalioby

Reputation: 2334

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()

Upvotes: 1

Related Questions