Способ в 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() в ваш шаблон и циклически просматривать его.