Объединение объектов набора запросов django, имеющих похожие значения - PullRequest
1 голос
/ 06 июля 2019

Это сайт eCom, над которым я работаю. Мне нужно отфильтровать результаты по электронной почте, как и при получении всех заказов, размещенных на этом почтовом ящике. При выполнении запроса OrderItem.objects.filter(order__email='john@john.com').select_related('order') я получаю объект набора запросов для каждого продукта. Таким образом, если в заказе было несколько продуктов, то каждый продукт является отдельным набором. Все, что мне нужно, - это все элементы, объединенные в один набор для идентификатора заказа, чтобы я мог их перебирать в шаблоне.

OrderItem.objects.filter(order__email='john@john.com').select_related('order').values('order_id').annotate(ct=Count('pk')) - Этот запрос получает все эти идентификаторы и показывает, сколько наборов существует на один идентификатор. Точно так же мне просто нужны результаты, но с другими полями, такими как созданная дата, порядковый номер, транзакционный идентификатор, продукт.

Я изучил документацию по django, но, похоже, не нашел подходящего решения. Другой вариант заключается в том, чтобы вручную циклически проходить по каждому элементу в наборе запросов и разделять его на основе идентификатора order_id, содержащего несколько элементов, но опять же, который не кажется эффективным. Поэтому любые мысли о том, как поступить, были бы великолепны.

Модели ниже:

class Order(models.Model):
    payment_date = models.DateTimeField(blank=True, null=True)
    created_date = models.DateTimeField(auto_now_add=True)
    transaction_id = models.CharField(max_length=256, blank=True, null=True)
    email = models.EmailField(max_length=128, blank=True, null=True)


    def __str__(self):
        return "Order #{},Date:{}".format(self.id,self.created_date)



class OrderItem(models.Model):
    product = models.ForeignKey(PRODUCT_VARIANT_MODEL, on_delete=models.DO_NOTHING)
    quantity = models.IntegerField(default=1)
    order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)


    def __str__(self):
        return "Quantity:{},Item:{},{}".format(self.quantity, self.product.get_product_title(),self.order)

Результат запроса 1: (по этому идентификатору электронной почты размещено 2 заказа) OrderItem.objects.filter(order__email='john@john.com').select_related('order')

<QuerySet [<OrderItem: Quantity:3,Item:sampleitem 1,Order #21,Date:2019-06-07 06:14:22.929052+00:00>, <OrderItem: Quantity:1,Item:sampleitem 91,Order #22,Date:2019-06-24 05:33:16.509479+00:00>, <OrderItem: Quantity:2,Item:sampleitem 44,Order
 #22,Date:2019-06-24 05:33:16.509479+00:00>, <OrderItem: Quantity:1,Item:sampleitem 8,Order #22,Date:2019-06-24 05:33:16.509479+00:00>]>

Результат запроса 2: OrderItem.objects.filter(order__email='john@john.com').select_related('order').values('order_id').annotate(ct=Count('pk'))

<QuerySet [{'order_id': 21, 'ct': 1}, {'order_id': 22, 'ct': 3}]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...