当前位置:  开发笔记 > 编程语言 > 正文

在Django中,如何在没有显式查询的情况下从多对多关系中的额外字段中检索数据?

如何解决《在Django中,如何在没有显式查询的情况下从多对多关系中的额外字段中检索数据?》经验,为你挑选了1个好方法。

鉴于Django 1.0中的情况,您可以在多对多关系中获得额外数据:

class Player(models.Model):
  name = models.CharField(max_length=80)

class Team(models.Model):
  name = models.CharField(max_length=40)
  players = models.ManyToManyField(Player, through='TeamPlayer', related_name='teams')

class TeamPlayer(models.Model):
  player = models.ForeignKey(Player)
  team = models.ForeignKey(Team)
  captain = models.BooleanField()

多对多关系允许您使用属性访问相关数据(Team对象上的"players"属性或通过其相关名称使用Player对象上的"teams"属性).当其中一个对象被放置到模板的上下文中时(例如,一个团队放置在一个Context中,用于渲染一个生成Team的名单的模板),可以访问相关对象(即团队中的玩家),但是怎么能额外的数据(例如'队长')可以与来自上下文中对象的相关对象(例如团队)一起访问,而无需在上下文中添加额外的数据?

我知道可以直接查询中间表来获取额外的数据.例如:

TeamPlayer.objects.get(player=790, team=168).captain

要么:

for x in TeamPlayer.objects.filter(team=168):
  if x.captain:
    print "%s (Captain)" % (x.player.name)
  else:
    print x.player.name

然而,直接在中间表上执行此操作需要我在模板的上下文(TeamPlayer上的查询结果)中放置其他数据,如果可能的话,我试图避免这种情况.



1> iammichael..:

所以,在提问后15分钟,我找到了自己的答案.

使用dir(Team),我可以看到另一个生成的属性名称teamplayer_set(它也存在于Player上).

t = Team.objects.get(pk=168)
for x in t.teamplayer_set.all():
  if x.captain:
    print "%s (Captain)" % (x.player.name)
  else:
    print x.player.name

不知道如何自定义生成的related_name,但至少我知道我可以从模板获取数据而无需在上下文中添加其他查询结果.


如果这样做,每次执行x.play.name时都会查询数据库(以便从DB中获取Player).查找selected_related的文档.
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有