Как хранить список кортежей в модели django
Я работаю над веб-приложением базы данных рецептов блюд на Django 4 и хочу хранить неизвестное количество ингредиентов, необходимых для рецепта, в рамках заданной модели. Ингредиент описывается названием, объемом и единицей измерения - например: сахар 400 грамм, яйца 2 штуки и т.д. Я использую PostgreSQL
Какова наилучшая практика хранения таких данных в рамках данной модели с сохранением возможности запрашивать данные или выполнять арифметические операции над объемами ингредиентов, пожалуйста?
Я нашел два варианта, но поскольку я очень новичок в веб-разработке, я не знаю, могут ли они работать:
- Создайте отдельную модель для ингредиента и используйте отношения "многие-ко-многим" для соединения моделей, но это создаст новый объект для каждого экземпляра, который, например, отличается по объему .
- Просто используйте TextField(), а затем используйте безумный Regex для разделения ингредиентов
Учитывая, что я новичок в веб-разработке, я понятия не имею, что является наиболее подходящим вариантом.
Спасибо
- Создайте отдельную модель для ингредиента и используйте отношения "многие-ко-многим"...
Отношения "многие ко многим" полезны, когда нужно отфильтровать рецепты по их ингредиентам. Например, чтобы перечислить все рецепты, содержащие яйца или сахар.
Если вам нужна эта возможность, то вам придется использовать поле "многие ко многим".
... но это создаст новый объект для каждого экземпляра, который, например, имеет разный объем
.
Поля отношения "многие ко многим" поддерживают аргумент through
, который позволяет вам передать промежуточную модель для хранения дополнительных данных, чтобы избежать этой проблемы. См. Дополнительные поля в отношениях "многие-ко-многим" в документации.
- Просто используйте TextField(), а затем используйте какой-нибудь сумасшедший Regex для разделения ингредиентов
Если вы не хотите фильтровать по ингредиентам, использование JSONField
является лучшим выбором, чем ManyToManyField
или TextField
. Это позволит вам хранить данные в структурированном формате, например:
ingredients = [
{'name': 'Sugar', 'qty': '400 grams'},
{'name': 'Egg', 'qty': '1'},
...
]
P.S.: Если вы собираетесь использовать JSONField
, также взгляните на созданную мной библиотеку django-jsonform
, которая полезна для создания удобных форм редактирования JSON в админке