【问题标题】:Django manytomany querying showing none and/or unsuccessfulDjango manytomany 查询显示没有和/或不成功
【发布时间】:2017-05-15 23:33:45
【问题描述】:

我在查询多对多关系中的项目列表时遇到问题。我要查询的模型如下。这是一个模型,将指示工人选择“开口”,并且许多工人可以选择相同的“开口”。我正在尝试选择已选择“职位空缺”但未成功的工作人员列表。

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()

【问题讨论】:

  • 我不明白你为什么尝试使用favopening_set。这是一对一的关系,而不是集合 - 正确的访问器是 favopening,您在下面的 sn-p 中正确使用了它。
  • 嗨丹尼尔,当我像你建议的那样使用 favopening 时,我得到的是空缺而不是工人。我试图跟随 favopening 一个对象,因为我需要经理帮助获取选择此开口的工作人员列表,但我收到“无法通过 FavOpening 实例访问经理”的错误,这很奇怪,因为当我打印时dir(openingobj.favopening),它表明对象在可以使用的属性列表中。

标签: django django-queryset manytomanyfield


【解决方案1】:

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

因此,您想要获取所有已选择职位空缺的工人的查询集。 下面的代码有用吗?

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

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

【讨论】:

  • 其实我需要得到一个查询集——一个选择了开口的工人列表。无论如何我都试过了,但是当我使用 openingobj.favopening_set.all() - 它给了我一个错误 - 'FavOpening' 对象没有属性'all'。
  • 非常感谢 Alex,现在可以使用了。稍微更正一下,它必须是workers_queryset = openingobj.favopening.worker.all() 而不是workers_queryset = opening.favopening.worker.all()。我停在了openobj.favopening.worker,因为结果显示workers.workers.None,我对此感到困惑并且没有继续超越。谢谢!!
  • 很高兴它有帮助!抱歉打错了,确实应该是openobj,而不是open!
猜你喜欢
  • 2015-06-23
  • 1970-01-01
  • 2018-11-14
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多