Django 中一种让一个模型的参数成为另一个模型的下拉选择的方法

A way in Django to have one model's parameters be a dropdown selection from another model

我正在创建一个食谱应用程序,为了避免重复,我想在不使用外键的情况下存储工具以避免重复。目前,每种成分都使用一个食谱作为外键,因为成分可以有不同的测量值,但我希望这些工具只能在数据库中出现一次。

相关型号如下:

class Recipe(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=200)
    servings = models.IntegerField(default=1, blank=False)

    def __str__(self):
        return self.name

class Instruction(models.Model):
    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
    description = models.CharField(max_length=400)

    def __str__(self):
        return f"Step #{self.id} - {self.description[:20]}"

class Tool(models.Model, unique=True):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=200)

    def __str__(self):
        return self.name

对于配料,我正在使用 forloop 创建一个 table(如下),但我不确定如何在数据库中没有多个条目的情况下对与食谱相关的工具执行相同的操作工具是一样的,除了相关的食谱,即“煎锅”不止一次。

<h3>Ingredients:</h3>
<table id ="ingredients">
<tr>
  <th>Ingredient</th>
  <th>Quantity</th>
</tr>
<tr>
  {% for ingredient in recipe.ingredient_set.all %}
</tr>
<tr>
  <td> {{ ingredient.name }} </td>
  <td>{{ ingredient.quantity}} {% if ingredient.units == "UN" %}{% else %}{{ ingredient.get_units_display.title }}{% endif %}</td>
</tr>
{% endfor %}
</table>

<h3>Tools:</h3>

Table for tools goes here

如果一个配方可以使用很多工具,而单个工具可以在多个配方中使用,那么您就有了一个 many-to-many 关系,并且可以根据文档 https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_many/

创建它

简而言之,将以下内容放入您的配方模型中并迁移您的数据库

tools = models.ManyToManyField(Tools)

这将创建一个 behind-the-scenes table 链接配方 ID 和工具 ID 以进行高效查找。如果您需要定义有关关系的其他内容,您可以手动处理 table,但如果这不是问题,则不必担心。

一旦到位,您可以将 recipe.tools.all() 传递给您的模板并循环使用它。