Django查询关系关系

时间:2012-09-13 19:20:09

标签: django orm django-models django-orm

我遇到了困扰我的Django ORM问题。我有一组由外键链接的模型,但要求有点奇怪。我需要按照他们的关系列出项目。这很难解释,所以我试图在下面描述这个,给出:

工作

  • 多对多(奖)

  • ForeignKey的(AwardCategory)

AwardCategory

我需要列出工作项,以便按奖项类别列出。期望的输出将是:

工作实例A

  • 属于奖项类别实例A的奖励实例A
  • 属于奖项类别实例A的奖励实例C
  • 属于奖项类别实例A的奖励实例G

工作实例A(与上述实例相同,但由不同的award__category列出)

  • 属于奖项类别实例B的奖励实例F
  • 属于奖项类别实例B的奖励实例R
  • 属于奖项类别实例B的奖励实例Z

工作实例B

  • 属于奖项类别实例A的奖励实例B
  • 属于奖项类别实例A的奖励实例A

基本上我想列出奖项类别的所有作品。我可以让这部分工作,但我的解决方案是肮脏和粗暴的。我想知道是否有更好的方法。我考虑使用ManyToMany和through属性,但我不确定我是否正确使用它。

2 个答案:

答案 0 :(得分:1)

根据模型的字段和关系调整以下内容:

for w in Work.objects.all():
    print w
    for award in w.award_set.order_by(awardcategory):
         print "%s that belongs to %s" % (award,award.awardcategory)

答案 1 :(得分:0)

所以我想出了类似的结果,但它仍然感觉有点脏:(

categories = AwardCategory.objects.all()
work = []
for cat in categories:
    work_in_cat = Work.objects.filter(awards__category=cat).distinct()
    for w in work_in_cat:
        work.append({
            'work': w,
            'category': cat,
            'awards': w.awards.filter(category=cat)
        })

这会产生我想要的结果,但是在for循环中执行此操作似乎是错误的!