【问题标题】:Django Querying Relation of RelationDjango查询关系的关系
【发布时间】:2012-09-06 22:57:59
【问题描述】:

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

工作

  • ManyToMany(奖)

奖项

  • 外键(AwardCategory)

奖项类别

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

工作实例 A

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

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

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

工作实例 B

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

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

【问题讨论】:

  • Award.category 指向“Category”,那么“AwardCategory”是什么?
  • 您当前期望的输出表明一个 Work 实例可以有多个奖项,但您的模型只显示一个奖项。

标签: django orm django-models django-orm


【解决方案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)

【讨论】:

    【解决方案2】:

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

    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 循环中这样做似乎很错误!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 2013-08-26
      • 1970-01-01
      • 2010-11-20
      • 2020-01-02
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      相关资源
      最近更新 更多