首页 > 解决方案 > 如何从一张表中选择项目并按其属性标记为 FK 对其进行排序

问题描述

我想选择保留项目并按 option.effectif 对其进行排序,其中选项在表保留中声明为 FK。我想要的sql是:

select * from configuration_option, configuration_reservation
where configuration_reservation.option_id= configuration_option.id and valide=True
order by configuration_option.effectif;

对于这个选择,我尝试过:

p=Reservation.objects.all().filter(Q(option_id__in=Option.objects.all().order_by('effectif'), valide=True))

这些型号是:

楷模

class Reservation( models.Model):
    cours=models.ForeignKey(Cours, on_delete=models.CASCADE)
    enseignant=models.ForeignKey(Enseignant, on_delete=models.CASCADE)
    date_du_jour_reserve=models.DateField("Date du jour reservé")
    option=models.ForeignKey(Option,on_delete=models.CASCADE )
    valide=models.BooleanField(blank=True, default=False)
    class Meta:
        ordering=('date_du_jour_reserve')

class Option(models.Model):
    code_option=models.CharField("Code de l'option", max_length=6,)
    libelle_option= models.CharField("Libélle de l'option", max_length=100)
    effectif=models.IntegerField("Effectif", default=0, validators=[
        MinValueValidator(limit_value=0 , message=" Attention votre option a un effectif négatif"),
    ])

    def __str__(self):
        return self.libelle_option
    class Meta:
        ordering=('libelle_option',)

标签: django

解决方案


您应该订购查询集本身。您可以使用双下划线 ( ) 在相关模型上.order_by(..)[Django-doc]__

Reservation.objects.filter(valide=True).order_by('option__effectif')

这里的过滤在 上不是必需的option,因为 anOption是 aForeignKey而没有null=True,因此这意味着 eachReservation总是指向一个Option模型。

如果您以后允许null=True,您可以使用以下内容进行过滤:

Reservation.objects.filter(
    option__isnull=False,
    valide=True
).order_by('option__effectif')

推荐阅读