由特定的ManyToMany对象订购Django QuerySet

时间:2014-05-03 16:54:01

标签: django django-orm django-filter

我有两个班--Arzt和Fachbereich - 通过ArztFachbereich的ManyToMany关系相关。

class Fachbereich(FachbereichUndArztFachbereiche):
    name = models.CharField(unique=True, max_length=100)

class Arzt(models.Model):
    name = models.CharField(max_length=500)
    fachbereich = models.ManyToManyField(Fachbereich, through="ArztFachbereich")

class ArztFachbereich(FachbereichUndArztFachbereiche):
    arzt = models.ForeignKey(Arzt)
    fachbereich = models.ForeignKey(Fachbereich)
    note = models.FloatField()

我知道如何通过Arzt的最小音符来获得结果。

Arzt.objects.annotate(best_note=Min("arztfachbereich__note")).order_by("best_note")

但接下来我首先用Fachbereich-ID(fb_id)过滤Arzt。现在我不需要最小音符或聚合的东西,但是这个特定的ArztFachbereich的注释。

澄清我在说什么: 像这样......但我不知道如何在django中做到这一点。

aerzte = Arzt.objects.filter(fachbereich=fb_id)
aerzte.order_by("arztfachbereich__note"
                WHERE arztfachbereich__fachbereich == 
                Fachbereich.objects.get(id=fb_id))

或者我想到的另一种方式:

aerzte = Arzt.objects.filter(fachbereich=fb_id)
aerzte.annotate(specific=ArztFachbereich.objects.get(arzt=self, fachbereich__id=fb_id)
aerzte.order_by("specific")

但我显然无法通过自我陈述来获取......

1 个答案:

答案 0 :(得分:3)

如果我理解正确,这应该有效:

Arzt.objects.filter(arztfachbereich__fachbereich_id=fb_id)
            .order_by("arztfachbereich__note")

有关此关系的任何查询都将在ArztFachbereich表(可能JOINArztFachbereich表上运行,具体取决于查询)。这里,filter()将对应于SQL WHERE子句,该子句将行限制为特定值fachbereich_id,然后order_by按顺序排列剩余行。 note值。

我认为你的困惑来自我们在Artz模型上查询的事实。这是否更有意义:ArztFachbereich.objects.filter(fachbereich_id=fb_id).order_by("note")?这两个语句基本上是等效的,但是对Artz进行过滤可以让您最终得到Artz个对象,而不是ArztFachbereich个对象。

(如果artzfachbereich不是unique_together的情况,则还需要在查询结束时放置distinct()以确保您不要在最终查询集中最终会出现重复的Artz个实例。)