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