正确使用select_related

时间:2014-09-20 15:16:32

标签: django django-views django-queryset django-orm django-select-related

我目前有以下代码,我想使用select_related进行优化。目的是找出至少有一个凭证的BaseReward集合,其中is_active = True

    class Basereward(models.Model):
        active = models.BooleanField()

    class Voucher(models.Model):
        reward = models.ForeignKey(BaseReward, related_name='reward_vouchers')
        is_active = models.BooleanField()

查看

    qs = BaseReward.objects.filter(active=True).all()
    for reward in qs:
        if not reward.reward_vouchers.filter(is_active=True).all():
            qs = qs.exclude(id=reward.id)
    return qs

这样做的正确方法是什么?我正在考虑使用反向关系使用select_related,但是文档说它不起作用 还有别的吗?

    qs = BaseReward.objects.filter(active=True).all().select_related(reward_vouchers)

1 个答案:

答案 0 :(得分:1)

反过来说,为至少有一个BaseReward获取唯一的Voucher个对象:

Voucher.objects.filter(is_active=True).distinct(reward)