Получение данных, принадлежащих полю модели в select_related списке, и создание датафрейма
Я пытаюсь запросить две связанные таблицы и создать рамку данных pandas, а затем использовать ее для поиска правил. Кадр данных должен выглядеть следующим образом,
order products
----------------
1 ['product1', 'product2']
2 ['product1', 'product3', 'product10']
...
Мои модели,
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ManyToManyField(Product, through='OrderedProduct', related_name='orders')
class OrderedProduct(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
quantity = models.IntegerField(default=1)
class Product(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
Я сделал часть создания датафрейма следующим образом в представлениях, и это работает, но требует предварительной обработки для получения конечного результата и кажется, что это неэффективно для большого набора данных.
orders = OrderedProduct.objects.all().values('order__id', 'product__name')
df = pd.DataFrame.from_records(orders)
df = df.groupby(['order__id'])['product__name'].apply(list).to_list()
Итак, мой вопрос: " Есть ли более прямой и эффективный подход для этого? ". Любой совет будет высоко оценен.
Используйте что-то похожее на это, я думаю, оно имеет лучшую производительность:
OrderedProduct.objects.raw('SELECT order__id, GROUP_CONCAT(product__name) FROM myapp_OrderedProduct GROUP BY order__id')