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-запросы при написании более питоническим способом.

Вернуться на верх