2010-07-02 4 views
0

Je construis un site de commerce électronique. J'ai un modèle de produit qui contient les informations communes à tous les types de produits:requête personnalisée dans django

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

Ensuite, je dois SimpleProduct et BundleProduct qui ont FK au produit et tenir des informations spécifiques au type de produit. BundleProduct a un champ m2m pour d'autres produits.

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

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

Lors de l'affichage du catalogue, je fais une requête sur le modèle de produit puis une autre requête par produit pour obtenir les informations supplémentaires. Cela implique un grand nombre de requêtes.

Je peux l'améliorer en utilisant select_related sur les champs simpleproduct et bundleproduct. Je peux encore l'améliorer en utilisant l'application select_reverse pour les champs m2m comme les catégories.

Ceci est une grande amélioration mais il y a plus de requêtes requises car un BundleProduct a plusieurs produits qui peuvent aussi avoir des relations avec d'autres produits (produit configurable).

Existe-t-il un moyen d'avoir une seule requête par rapport au produit qui récupèrera les catégories m2m, one2one SimpleProduct et BundleProduct et les produits BundleProduct?

Cette requête personnalisée ressemblera-t-elle à un queryset django avec tous les gestionnaires et propriétés?

Merci

Répondre

0

Vous pouvez éventuellement jeter un oeil à la extra method de QuerySets. Peut vous donner l'opportunité d'ajouter des champs supplémentaires. Mais si vous voulez des requêtes brutes, vous pouvez utiliser le raw method des gestionnaires, ceux-ci retourneront un type de jeu de requête, qui n'intégrera cependant pas toute la puissance des jeux de requête normaux mais devrait suffire à vos soucis. Sur cette même page, la méthode d'exécution est également affichée, c'est pour vraiment personnalisé SQL qui ne peut même pas traduire en querysets premières.

+0

Les deux extra et brut semblent ajouter des champs supplémentaires à l'objet. Est-il possible d'utiliser des requêtes brutes pour les objets imbriqués en profondeur? Dans mon cas product.bundleproduct.products.all() [0] .simpleproduct.categories.all() [2]? – pablo