【发布时间】: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