如何为 ManyToOne 字段中的特定记录构造 order_by?
How do I construct an order_by for a specific record in a ManyToOne field?
我正在尝试按存储在 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')
目前我能想到的唯一解决方案是为所有人创建一个新的统计信息 class 并为产品使用 OneToOneField。或者,为指向 ProductStats 中的所有统计信息的 Product 添加 OneToOneField。
感谢您的帮助。
如何在 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')
我正在尝试按存储在 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')
目前我能想到的唯一解决方案是为所有人创建一个新的统计信息 class 并为产品使用 OneToOneField。或者,为指向 ProductStats 中的所有统计信息的 Product 添加 OneToOneField。
感谢您的帮助。
如何在 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')