Способ в Django сделать так, чтобы параметры одной модели были выпадающим выбором из другой модели

Я создаю приложение для рецептов, и чтобы избежать дублирования, я хочу хранить инструменты без использования внешних ключей, чтобы избежать дублирования. В настоящее время каждый ингредиент использует рецепт в качестве внешнего ключа, поскольку ингредиенты могут быть разных размеров, но я бы хотел, чтобы инструменты могли быть в базе данных только один раз.

Вот соответствующие модели:

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 для создания таблицы (ниже), но я не знаю, как сделать то же самое для инструментов, связанных с рецептом, без того, чтобы несколько записей в базе данных для инструментов были одинаковыми, кроме связанного рецепта, т.е. "Сковорода" более одного раза.

<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

Если рецепт может использовать множество инструментов, а один инструмент может использоваться во многих рецептах, то у вас есть отношения "многие ко многим" и вы можете создать их в соответствии с документацией https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_many/

В двух словах, поместите следующее в вашу модель рецепта и мигрируйте вашу БД

tools = models.ManyToManyField(Tools)

Это создает таблицу, которая связывает идентификаторы рецептов и инструментов для эффективного поиска. Вы можете работать с этой таблицей вручную, если вам нужно определить другие вещи о взаимосвязи, но вам не нужно беспокоиться об этом, если это не является проблемой.

После этого вы можете передать recipe.tools.all() в ваш шаблон и циклически просматривать его.

Вернуться на верх