如何从一个表中选择项目并按其属性标记FK对其进行排序

时间:2019-07-14 11:15:04

标签: django

我想选择保留项并按option.effectif对其进行排序,其中在表保留中将option声明为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',)

1 个答案:

答案 0 :(得分:1)

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

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

option上的过滤不是必需的,因为Option是没有ForeignKey的{​​{1}},因此这意味着每个null=True是始终指向Reservation模型。

如果以后允许使用Option,则可以使用以下方法进行过滤:

null=True