Как построить order_by для конкретной записи в поле ManyToOne? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь отсортировать (упорядочить) по статистическим данным, хранящимся в связи 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)

Затем я бы хотел отсортировать товары по их статистике для демографических данных ALL (предположим, что у каждого продукта есть статистика, связанная с ним для ALL).Это может выглядеть примерно так:

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

В настоящее время единственное решение, о котором я могу подумать, - это либо создать новый класс статистики только для всех и использовать OneToOneField for Product.Или добавьте OneToOneField for Product, указывающий на ВСЕ статистические данные в ProductStats.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы можете аннотировать значение соответствующей демографической группы и порядок следующим образом:

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')
0 голосов
/ 21 января 2019

Как примерно так, используя несколько полей в 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...