Django按多个过滤的外键值排序

时间:2016-06-29 19:26:02

标签: python django

我正在尝试按相关字段的多个值排序,按键过滤,但运行第二个order_by是按第一个过滤器排序,而不是最新的。

class Product(Model):
    name = CharField()


class ProductAttribute(Model):
    product = ForeignKey(Product)
    key = CharField()
    value = FloatField()


# This line sorts products as expected over the `ProductAttribute`s with a key of 'score'
products = Product.objects.filter(productattribute_set__key='score')\
                          .order_by('productattribute_set__value')

# This line sorts products as expected over the `ProductAttribute`s with a key of 'rating'
products = Product.objects.filter(productattribute_set__key='rating')\
                          .order_by('productattribute_set__value')

# This line sorts products based on score only, not on rating, then score (or vise versa)
products = Product.objects.filter(productattribute_set__key='score')\
                          .order_by('productattribute_set__value')\
                          .filter(productattribute_set__key='rating')\
                          .order_by('productattribute_set__value')

有没有办法按score的价值排序,然后rating的价值?

1 个答案:

答案 0 :(得分:1)

我不确定这是否是您正在寻找的那种答案,但我建议将评级和分数作为产品属性的外键添加到您的Product表中,而不是相反。对我而言,这作为一种模式更有意义。

class Product(Model):
    name = CharField()
    score = ForeignKey(ProductAttribute)
    rating = ForeignKey(ProductAttribute)


class ProductAttribute(Model):
    key = CharField()
    value = FloatField()

然后您可以使用以下方式轻松订购:

order_by(score__value, rating__value)

我认为另一种方式会产生太多不必要的工作,特别是如果你没有太多额外的产品属性。<​​/ p>