Django manytomany查询显示无和/或不成功

时间:2017-01-01 16:31:49

标签: django django-queryset manytomanyfield

我无法查询多对多关系中的项目列表。我试图查询的模型如下。这是一个模型,表明工人选择"开放"许多工人可以选择相同的"开放"。我正在尝试选择已选择"开放"但我没有成功。

class FavOpening(models.Model):
    opening = models.OneToOneField(Openings, blank=True, default=None)
    worker = models.ManyToManyField(Worker, blank=True, default=None)

    def __unicode__(self):
        return str(self.opening)

这很奇怪,因为我在下面尝试了基于所选工人(id-31)的打开类型并且它起作用,工人选择的开口将打印。

employee = get_object_or_404(Worker, id=31)
print employee.favopening_set.all()

但是,当我以相反的方式使用下面的方法让工作人员进入许多人时,它不起作用。说它没有属性" favopening_set"

openingobj = get_object_or_404(Openings, id=1)
print openingobj.favopening_set.all()

我还尝试按照以下内容获取基于开头的工作人员列表(id = 1),但我没有得到任何结果 - 显示Workers.Worker.None,这不是真的,因为我至少有一个工人选择了这个开场。(我在管理员处查看)

openingobj = get_object_or_404(Openings, id=1)
print openingobj.favopening.worker

最后,我根据一些研究说明了使用预取来获取一系列内容 - What's the difference between select_related and prefetch_related in Django ORM?,但是它说管理器无法通过开放实例访问。

openingobj = get_object_or_404(Openings, id=1)
openingobj.objects.prefetch_related('favopening_set').all()

1 个答案:

答案 0 :(得分:4)

编辑回复以考虑评论中的反馈

因此,您希望获得已选择开口的所有工作人员的查询集。 代码如下有帮助吗?

  openingobj = get_object_or_404(Openings, id=1)
  workers_queryset = opening.favopening.worker.all()

我认为将“工人”重命名为“工人”可能是个好主意。