我想要爲食譜數據庫建立一個前端,使用戶能夠搜索用戶提供的配料可烹飪的食譜列表。選擇在給定字符串中相關對象ID爲* all *的對象
我有以下型號
class Ingredient(models.Model):
name = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100, unique=True)
importancy = models.PositiveSmallIntegerField(default=4)
[…]
class Amount(models.Model):
recipe = models.ForeignKey('Recipe')
ingredient = models.ForeignKey(Ingredient)
[…]
class Recipe(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField()
instructions = models.TextField()
ingredients = models.ManyToManyField(Ingredient, through=Amount)
[…]
和不正是我想要什麼rawquery:它讓所有包含在字符串的用戶提供的列表,其需要的成分所有的食譜。如果他提供的不是必要的話,那也沒關係。
query = "SELECT *,
COUNT(amount.zutat_id) AS selected_count_ingredients,
(SELECT COUNT(*)
FROM amount
WHERE amount.recipe_id = amount.id)
AS count_ingredients
FROM amount LEFT OUTER JOIN amount
ON (recipe.id = recipe.recipe_id)
WHERE amount.ingredient_id IN (%s)
GROUP BY amount.id
HAVING count_ingredients=selected_count_ingredients" %
",".join([str(ingredient.id) for ingredient in ingredients])
recipes = Recipe.objects.raw(query)
現在,我正在尋找的是一種不依賴於.raw()
,因爲我想Django的queryset的方法去做純粹的方式。
此外,如果你們知道在查找中包含成分的重要性的方法,那麼即使其中一個成分(具有0的重要性)仍未顯示作爲結果的配方由用戶提供。
您的解決方案基本上是一個更快的版本'食譜= Recipe.objects.filter (ingredients__in =成分).distinct()'。但它甚至顯示只有一種配料與串的共同配方。我只想列出那些有**所有**的成分與繩子相同的人。 – jnns 2010-05-01 07:52:17