2017-06-06 24 views
0

当我遍历一个Prize.objects.all()集合时,我试图从PrizeItem获得quantity值,但它似乎只引用GameItem模型,而不引用提供访问中间PrizeItem属性。在穿透关系中获取中间模型的值

我该如何访问穿透模型的属性?

机型:

class GameItem(models.Model): 
    '...' 


class Prize(models.Model):  
    '...' 

    item   = models.ManyToManyField(GameItem, through='PrizeItem') 

class PrizeItem(models.Model):  
    #relations 
    game_item  = models.ForeignKey(GameItem, on_delete=models.CASCADE) 
    prize   = models.ForeignKey(Prize, on_delete=models.CASCADE) 
    #Item details 
    quantity   = models.IntegerField(null=True, blank=True, default=1) 

浏览次数:

def gameprizes(request): 
    prizes=Prize.objects.all() 
    context={'prizes':prizes} 
    return render(request, "the-app/game-prizes.html", context) 

模板:

{% if prize.item.all %} 
<table class="table table-condensed"> 
    <tbody> 
    {% for prize_item in prize.item.all %} 
     <tr> 
      <td>{{ prize_item.type }}</td><td>{{ prize_item.name }} {{ prize_item.quantity }}</td> 
     </tr> 
    {% endfor %} 
    </tbody> 
</table> 
{% endif %} 
+0

你如何使用查询集?你的循环是什么样的? – karthikr

+0

已更新,以显示更详细的信息 – Pipsqweek

+0

理想情况下,我希望能够在不需要进行大量查询或进行复杂连接(也是征税)的情况下提供“数量” – Pipsqweek

回答

0

就有点难看,当它涉及到查询集中的中间模型。你能解决这个问题的方法之一是:

class Prize(models.Model):  
    '...' 

    item   = models.ManyToManyField(GameItem, through='PrizeItem') 

    def quantity(self): 
     return self.item.quantity 

注意,这确实会导致更多的疑问,您可以使用prefetch_related在查询优化

另一种选择是使用的模板

对于游戏项目,你会做这样的事情:

class GameItem(models.Model): 
    '...' 

    def quantity(self): 
     return self.prizeitem_set.first() 
0
  1. 什么是地狱与模型? 〜>使用@karthikr答案
  2. 在views.py刚准备(覆盖query_set)
  3. 使用(_set〜加盟)在HTML

有一个愉快的一天,不让人很难,给最强的部分(服务器 - 数据库)

相关问题