Как агрегировать с prefetch related и prefetch - PullRequest
0 голосов
/ 10 января 2020

У меня есть две модели clini c и ClinicCredits: мне нужен список клиник с суммой доступного баланса. Проблема в том, что если я использую аннотацию, мне нужно l oop для avalibale alance с набором запросов Clincredits:

class Clinic(models.Model):
    """
    clinic model
    """
    user = models.OneToOneField(User, related_name="clinic", primary_key=True, 
     on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'clinic'




 class ClinicCredits(models.Model):
 """
  credit details for clinic
 """
    clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE, related_name='c_credits')
    credits = models.FloatField('credits', default=0.0)
    balance = models.FloatField('balance', default=0.0, help_text="balance after deduction of credits")

    def __str__(self):
        return self.clinic.name

    class Meta:
       db_table = 'clinic_credits'

вот мой запрос на выборку clini c:

    clinics = Clinic.objects.filter(practice_id__in=user.dietitian.practiceid).order_by(
        'user__date_joined').prefetch_related(Prefetch('c_credits',ClinicCredits.objects.filter(balance__gt=0),'credit_'))

и как я могу использовать агрегат в этом состоянии или есть какой-то другой способ получить список clini c с их доступными кредиты.

1 Ответ

4 голосов
/ 10 января 2020

Вы можете попробовать это, используя annotate(...):

clinics = Clinic.objects.filter(
    practice_id__in=user.dietitian.practiceid
).order_by('user__date_joined').prefetch_related(
    Prefetch(
        'c_credits',
        ClinicCredits.objects.filter(balance__gt=0),
        'credit_'
    )
)<b>.annotate(
    total_cred=Sum('c_credits__balance')
)</b>
...