当我遍历一个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 %}
答案 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)
度过美好的一天,不要让它变得艰难,为最强者(服务器 - 数据库)提供最难的部分