Получение данных, принадлежащих полю модели в 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')
Вернуться на верх