在直通关系中获取中间模型中的值

时间:2017-06-06 23:07:37

标签: python django model

当我遍历一个Prize.objects.all()集时,我试图从quantity获取PrizeItem值,但它似乎只引用了GameItem模型,但没有提供访问权限中间PrizeItem属性。

如何访问Through模型的属性?

模型:

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) 

TEMPLATE:

{% 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 %}

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

  1. 模特到底怎么了? 〜&GT;使用@karthikr答案
  2. 只需准备views.py(覆盖query_set)
  3. 在html中使用(_set~join)
  4. 度过美好的一天,不要让它变得艰难,为最强者(服务器 - 数据库)提供最难的部分