首页 > 解决方案 > 如何在 django 中的子查询集上使用 order 子句过滤查询集

问题描述

我有一个返回有序查询集的基本查询,我应该将该查询集用作另一个查询集的过滤器,但我的第二个查询集没有以相同的顺序返回。

这是我的代码:

    queryset = ProductModel.objects.filter(
        id__in=SponsoredProductModel.objects.filter(
            product_id=self.request.parser_context['kwargs']['pk'],
        ).order_by('position').values_list('sponsored_product', flat=True),
    )

这是我的产品模型:

class ProductModel(basemodel.BaseModel):
    # relative fields
    company = models.ForeignKey(CompanyModel, on_delete=models.PROTECT)
    tax = models.ForeignKey(
        TaxModel, on_delete=models.PROTECT,
        null=True, blank=True
    )
    brand = models.ForeignKey(
        BrandModel, on_delete=models.PROTECT,
        null=True, blank=True
    )
    name = models.CharField(max_length=200)
    unit = models.ForeignKey(
        UnitModel, on_delete=models.PROTECT,
        null=True, blank=True

这是 SponsoredProductModel:

class SponsoredProductModel(basemodel.BaseModel):
    product = models.ForeignKey(
        ProductModel, on_delete=models.PROTECT,
        related_name='sponsored_base_product'
    )
    sponsored_product = models.ForeignKey(
        ProductModel, on_delete=models.PROTECT,
        related_name='sponsored_member_product'
    )
    position = models.IntegerField(default=-1)

我希望按职位订购我的赞助产品模型并以相同的顺序获得产品。

我怎样才能做到这一点?

标签: pythondjango-modelsdjango-orm

解决方案


对值列表进行排序将无济于事,因为数据库只会过滤这些值,而不是对它们进行排序。但是你根本不需要这些。

您可以简单地按sponsored产品的位置订购:

ProductModel.objects.filter(
    sponsored_member_product__product_id=self.request.parser_context['kwargs']['pk']
).order_by('sponsored_member_product__position')

因此,这将通过遵循关系(中的)按相关模型过滤排序对象。sponsored_member_productrelated_nameForeignKey


注意:型号通常没有Model后缀。因此,最好重命名ProductModelProduct.


推荐阅读