2010-06-08 3 views
0

Le modèle:django gauche se joindre à null

class Product(models.Model): 
    name = models.CharField(max_length = 128) 
    def __unicode__(self): 
    return self.name 

class Receipt(models.Model): 
    name = models.CharField(max_length=128) 
    components = models.ManyToManyField(Product, through='ReceiptComponent') 
    class Admin: 
    pass 

    def __unicode__(self): 
    return self.name 

class ReceiptComponent(models.Model): 
    product = models.ForeignKey(Product) 
    receipt = models.ForeignKey(Receipt) 
    quantity = models.FloatField(max_length=9) 
    unit = models.ForeignKey(Unit) 
    def __unicode__(self): 
    return unicode(self.quantity!=0 and self.quantity or '') + ' ' + unicode(self.unit) + ' ' + self.product.genitive 

L'idée: il y a des composants en stock. Je voudrais savoir quelles recettes je peux faire avec des composants que j'ai.

Ce n'est pas facile - mais possible - j'ai fait une vue SQL, qui obtient la solution. Mais je suis python apprendre et Django donc je voudrais faire de style Django; D

Le concept de solution:

  1. obtenir l'ensemble des recettes qui a enfin un composant:

    list_of_available_components = ReceiptComponent.objects.filter (product__in = list_of_available_products) .distinct() = list_of_related_receipts Receipt.objects.filter (receiptcomponent__in = list_of_available_components) .distinct()

  2. obtenir des recettes (de list_of_related_receipts) qui n'a pas enfin un composant

    list_of_incomplete_recipes = (SELECT * FROM GAUCHE drinkbook_receiptcomponent INSCRIPTION drinkstore_stock_products UTILISATION (product_id) OÙ drinkstore_stock_products.stock_id EST NULLE ET receipt_id IN (SELECT receipt_id DE drinkbook_receiptcomponent JOIN drinkstore_stock_products USING (product_id)))

  3. obtenir des recettes (de list_of_related_receipts) qui ne sont pas "list_of_incomplete_recipes"

+0

Pas exactement (pour l'instant je ne trouve pas de cause similaire). La principale différence est qu'ailleurs il y a des modèles qui peuvent avoir des valeurs nulles - pas les miennes. J'ai des valeurs nulles dans la requête résultat - pas dans le modèle –

Répondre

0

Heh. Comme je suis stupide. Cela pourrait être résolu beaucoup plus facilement. Je n'ai pas besoin de trouver des recettes qui ont au moins un composant. Je peux (de la même façon!) Trouver des recettes que je ne peux pas faire car il y a au moins un composant que je n'ai pas.

list_of_unavailable_components = ReceiptComponent.objects.exclude(product__in=list_of_available_products).distinct() 

Et maintenant.

list_of_available_receipts = Receipt.objects.exclude(receiptcomponent__in = list_of_unavailable_components).distinct() 

Simple et propre. Merci de votre coopération; D