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)
Другая таблица:
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)
Я хочу сделать запрос во внутреннем соединении или другим способом так, чтобы:
select all from RequestPop where PopSummary.approve=True
Я выполняю следующий запрос.
queryset = RequestPop.objects.filter(popuser__approve=True).all()
но это кажется неправильным. Каким должно быть решение для этого, пожалуйста.
Это неправильно, так как RequestPop не имеет атрибута popuser, вы можете пойти другим путем.
queryset = PopSummary.objects.filter(approve=True)
for obj in queryset
reqpop=obj.popuser_set.all()
Прежде всего, я предложу использовать внешние ключи вместо положительных, чтобы вы могли выполнять запросы более питоническими способами
Вы можете записать эту строку как
requested_pop = model.ForeignKey(RequestPop,on_delete=models.CASCADE,null=True, related_name="pop_summaries")
Теперь вы можете написать запрос следующим образом
request_pops = RequestPop.objects.filter(pop_summaries__approve=True)
Это именно то, чего вы хотите достичь.
Поэтому всегда старайтесь использовать внешние ключи вместо целого числа в качестве ссылки, чтобы Django мог создавать для них join-запросы при написании более питоническим способом.