2010-07-02 1 views
0

Я создаю сайт электронной коммерции. У меня есть модель продукта, который содержит данные, общие для всех видов продукции:пользовательский запрос в django

class Product(models.Model): 
    name=models.CharField() 
    description=models.CharField() 
    categories = models.ManyToManyField(Category) 

Тогда у меня есть SimpleProduct и BundleProduct, которые имеют FK к продукту и удерживать информацию, относящуюся к типу продукции. BundleProduct имеет поле m2m для других продуктов.

class SimpleProduct(Product): 
    some_field=models.CharField() 

class BundleProduct(Product): 
    products = models.ManyToManyField(Product) 

При отображении каталога я сделать один запрос к модели продукта , а затем другой запрос на продукт, чтобы получить дополнительную информацию. Это связано с большим количеством запросов.

Я могу улучшить его, используя select_related для полей simpleproduct и bundleproduct. Я могу улучшить его, используя приложение select_reverse для полей m2m, таких как категории.

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

Есть ли способ получить один запрос к Продукту, который будет получать категории m2m, one2one SimpleProduct и BundleProduct и продукты BundleProduct?

Будет ли этот пользовательский запрос выглядеть как django queryset со всеми менеджерами и свойствами?

Благодаря

ответ

0

Возможно, вы можете взглянуть на extra method из querysets. Может дать вам возможность добавить дополнительные поля. Но если вам нужны необработанные запросы, вы можете использовать raw method менеджеров, они возвратят тип запроса, который, однако, не будет использовать всю мощность обычных запросов, но должен быть достаточным для ваших проблем. На этой же странице также показан метод execute, это для действительно настраиваемого sql, который не может даже перевести на необработанные запросы.

+0

Как дополнительные, так и необработанные, похоже, добавляют дополнительные поля к объекту. Возможно ли использовать необработанные запросы для глубоких вложенных объектов? В моем случае product.bundleproduct.products.all() [0] .simpleproduct.categories.all() [2]? – pablo