Это сайт 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}]>