如何与prefetch相关和prefetch进行聚合
How to aggregate with prefetch related and prefetch
我有两个模型 clinic 和 ClinicCredits:
我想要一个可用余额总和的诊所列表
问题是,如果我使用注释,我必须使用 cliniccredits 的查询集来循环获取可用的 alance :
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'
这是我获取诊所的查询:
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_'))
以及我如何在这种情况下使用聚合,或者是否有其他方法可以检索诊所列表及其可用学分。
你可以这样尝试 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>
我有两个模型 clinic 和 ClinicCredits: 我想要一个可用余额总和的诊所列表 问题是,如果我使用注释,我必须使用 cliniccredits 的查询集来循环获取可用的 alance :
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'
这是我获取诊所的查询:
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_'))
以及我如何在这种情况下使用聚合,或者是否有其他方法可以检索诊所列表及其可用学分。
你可以这样尝试 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>