Джанго осталось присоединиться к нулю - PullRequest
0 голосов
/ 08 июня 2010

Модель:

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 (receivecomponent__in = list_of_available_components) .distinct ()

  2. получить рецепты (из list_of_related_receipts), в которых нет ни одного, наконец, компонента

    list_of_incomplete_recipes = (SELECT * FROM

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

1 Ответ

0 голосов
/ 08 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...