2010-06-08 2 views
0

Модель:Джанго оставил присоединиться к нулевой

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 

Идея: есть компоненты на складе. Я хотел бы узнать, какие рецепты я могу сделать с компонентами, которые у меня есть.

Это непросто - но возможно - я сделал SQL-представление, которое получает решение. Но я учусь Python и Django, поэтому я хотел бы сделать это Django-стиль; D

Концепция решения:

  1. получить набор рецептов, который имеет на один последний компонент:

    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. получить рецепты (от list_of_related_receipts), который не один последний компонент

    list_of_incomplete_recipes = (SELECT * FROM drinkbook_receiptcomponent LEFT JOIN drinkstore_stock_products ИСПОЛЬЗОВАНИЕ (product_id) WHERE drinkstore_stock_products.stock_id IS NULL AND receipt_id IN (SELECT receipt_id FROM drinkbook_receiptcomponent РЕГИСТРИРУЙТЕСЬ drinkstore_stock_products ИСПОЛЬЗОВАНИЕ (product_id)))

  3. получить рецепты (от list_of_related_receipts), которые не находятся в "list_of_incomplete_recipes"

+0

Нет точно (на данный момент я не могу найти какую-либо подобную причину). Основное различие заключается в том, что в других местах существуют модели, которые могут иметь нулевые значения - не мои. У меня есть нулевые значения в запросе результата - не в модели –

ответ

0

Хех. Как глупо я. Это можно решить гораздо проще. Мне не нужно искать рецепты, содержащие хотя бы один компонент. Я могу (так же!) Найти рецепты, которые я не могу сделать, потому что есть хотя бы один компонент, который у меня НЕ.

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

И теперь.

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

Простой и чистый. Спасибо за сотрудничество; D