如何为多对一字段中的特定记录构造order_by



我正在尝试按存储在ManyToOne关系中的统计数据进行排序(排序)。假设我有以下代码:

class Product(models.Model):
    info        = ...
    data        = models.IntegerField(default=0.0)
class Customer(models.Model):
    info        = ...
    purchases   = models.ManyToManyField(Product, related_name='customers', blank=True)
class ProductStats(models.Model):
    ALL         = 0
    YOUNG       = 1
    OLD         = 2
    TYPE = ((ALL, 'All'), (YOUNG, 'Young'), (OLD, 'Old'),)
    stats_type  = models.SmallIntegerField(choices=TYPE)
    product     = models.ForeignKey(Product, related_name='stats', on_delete=models.CASCADE)
    data        = models.FloatField(default=0.0)

然后,我想按所有人口统计的统计数据对产品进行排序(假设每个产品都有一个与之相关的所有统计数据)。这可能如下所示:

products = Product.objects.all().order_by('stats__data for stats__stats_type=0')

目前,我能想到的唯一解决方案是要么为所有人创建一个新的统计类,要么为产品使用一对一字段。或者,为产品添加一个一对一字段,指向产品统计中的所有统计信息。

谢谢你的帮助。

像这样在order_by中使用多个字段怎么样:

 Product.objects.all().order_by('stats__data', 'stats__stats_type')
 # it will order products from stats 0, then 1 then 2

或者,如果您只想获取 stats_type 0 的数据:

 Product.objects.filter(stats__stats_type=0).order_by('stats__data')

您可以通过以下方式注释相关人口统计和顺序的值:

from django.db.models import F
Product.objects.all().filter(stats__stats_type=0).annotate(data_for_all=F('stats__data').order_by('data_for_all')

最新更新