我有两个班--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")
但我显然无法通过自我陈述来获取......
答案 0 :(得分:3)
如果我理解正确,这应该有效:
Arzt.objects.filter(arztfachbereich__fachbereich_id=fb_id)
.order_by("arztfachbereich__note")
有关此关系的任何查询都将在ArztFachbereich
表(可能JOIN
到Arzt
和Fachbereich
表上运行,具体取决于查询)。这里,filter()
将对应于SQL WHERE
子句,该子句将行限制为特定值fachbereich_id
,然后order_by
按顺序排列剩余行。 note
值。
我认为你的困惑来自我们在Artz
模型上查询的事实。这是否更有意义:ArztFachbereich.objects.filter(fachbereich_id=fb_id).order_by("note")
?这两个语句基本上是等效的,但是对Artz
进行过滤可以让您最终得到Artz
个对象,而不是ArztFachbereich
个对象。
(如果artz
和fachbereich
不是unique_together
的情况,则还需要在查询结束时放置distinct()
以确保您不要在最终查询集中最终会出现重复的Artz
个实例。)