0

我目前有以下代码,我想使用select_related进行优化。其目的是要找出一套BaseReward对其中至少有一个用券= IS_ACTIVE真正确使用select_related

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

周围做它的其他方式,获得其中至少有一个Voucher一套独特BaseReward对象:

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

谢谢你,其实我需要的最终查询集返回(QS)成为BaseReward对象的列表。目前你放的东西会给我优惠券物品。我应该在最后添加它:Voucher.objects.filter(is_active = True).distinct(reward).reward.all()? – dowjones123 2014-09-20 15:38:52

+0

所有'Voucher'对象都有'voucher.reward'对象,它代表该凭证的'BaseReward'对象;更不用说你写的'distinct(reward).reward.all()'是无效的;如果你想要的只是奖励对象,请尝试'distinct('reward')。values('reward')',参见['values']的文档(https://docs.djangoproject.com/en/1.4/ ref/models/querysets /#values)以获取更多信息。 – 2014-09-20 16:31:08

+0

感谢Burhan。我尝试了不同的('奖励')。价值('奖励'),并且它给了我:['reward':3},{'reward':4},{'reward':5},{'reward': 6},{'reward':7},{'reward':8},{'reward':11}] 我在找的是一个带有BaseReward对象的查询集,因为我在一个REST框架的get_queryset()方法Viewset – dowjones123 2014-09-20 21:06:59