Reputation: 1105
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
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
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