【问题标题】:Django manytomany relationship on recipe-meal食谱餐上的 Django 多对多关系
【发布时间】:2023-03-15 08:45:02
【问题描述】:

所以我有这两个模型,即食谱和膳食。例如,我想为鸡肉和面食配料买鸡肉面食。我该怎么做?

class Recipe(models.Model):
    mealId = models.ForeignKey('meal.Meal',on_delete=models.CASCADE,related_name='meal')
    ingredientId=models.ManyToManyField('ingredient.Ingredient')
    amountId=models.ManyToManyField('amount.Amount')


class Meal(models.Model):
    mealName=models.CharField(max_length=100,verbose_name="Meal name")
    desc=RichTextField()
    img=models.ImageField(blank=True)
    categoryId=models.ManyToManyField('category.Category')

【问题讨论】:

  • 您使用成分模型中的哪个字段进行搜索? Reciple of the Chicken Pasta 可以不只有鸡肉和意大利面的成分吗?
  • 您发布了Meal,这与您的问题没有明显联系(您想要鸡肉和意大利面食谱,对吗?)。而且您还没有发布Ingredient,这将是相关的。

标签: django django-models many-to-many django-orm


【解决方案1】:

如果您想按 Ingredient 模型的 name 字段搜索成分,因为“chicken”、“pasta”和您的鸡肉意大利面的食谱可以包含其他成分,例如:“鸡肉”、“意大利面”、“盐”、“酱”。然后你可以这样做:

# put here import your models
names_for_search = [
        "chicken",
        "pasta"
    ]
queryset = Recipe.objects.all()
for name in names_for_search:
    queryset = queryset.filter(ingredientId__name__in=[name])
result_reciple = queryset.first()
if result_reciple is not None:
    result_meal = result_reciple.mealId

【讨论】:

  • 我认为您可以删除 for 循环并使用 queryset=queryset.filter(ingredientId__name__in=names_for_search)
  • @ruddra 没有循环,您选择具有列表中任一成分的食谱。
  • 是的,你说得对。但在这种情况下,我认为您需要删除__in,因为据我所知__in 在列表中有效。
  • @ruddra 是的,__in 在列表中工作,忘记了括号
猜你喜欢
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2017-07-11
  • 2012-02-26
  • 1970-01-01
相关资源
最近更新 更多