我正在尝试按存储在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')