Как обрабатывать ингредиенты рецепта в базе данных
Привет, я новичок в программировании и создаю сайт рецептов, чтобы научиться, но я не могу понять, как обрабатывать ингредиенты рецепта? Я хотел бы сделать следующее:
- Иметь глобальные ингредиенты для рецептов, т.е. общие ингредиенты, курица, говядина и т.д.
- Разрешить пользователям создавать свои собственные ингредиенты (только для этого пользователя), например, большой помидор .
- Прикреплять ингредиенты к рецепту независимо от того, являются ли они глобальными или созданными пользователем .
- Позволяет пользователям добавлять ингредиенты в свою кладовую и указывать, сколько ингредиентов у них есть в наличии
Ниже приведено то, что я думаю, что модели хотели бы получить, но я не уверен, что это правильно или лучший метод, любой совет приветствуется.
recipe/models.py
User = settings.AUTH_USER_MODEL
class Recipe(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
recipeName = models.CharField(max_length=220) # grilled chicken pasta
userRecipeIngredients = models.ManyToManyField(UserCreatedIngredient, blank=True, Null=True, through='IngredientToRecipe')
globalRecipeIngredients = models.ManyToManyField(GlobalIngredient, blank=True, Null=True, through='IngredientToRecipe')
class UserCreatedIngredient(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=220) # grilled chicken
class GlobalIngredient(models.Model):
name = models.CharField(max_length=220) # chicken
class IngredientToRecipe(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
userIngredient = models.ForeignKey(UserCreatedIngredient, on_delete=models.SET_NULL)
globalIngredient = models.ForeignKey(GlobalIngredient, on_delete=models.SET_NULL)
quantity = models.CharField(max_length=50, blank=True, null=True) # 400
unit = models.CharField(max_length=50, blank=True, null=True) # pounds, lbs, oz ,grams, etc
instructions = models.TextField(blank=True, null=True) # chopped, diced etc.
pantry/models.py:
from recipes.models import IngredientToRecipe
User = settings.AUTH_USER_MODEL
class pantryIngredients(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
ingredients = models.ForeignKey(IngredientToRecipe, on_delete=models.SET_NULL)
inStock = = models.IntegerField(default=0, blank=False) # user can increment i.e. two chicken in stock
Одним из способов решения первых трех требований в вашем вопросе было бы встроить наследование в ваши модели.
class Recipe(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
recipeName = models.CharField(max_length=220) # grilled chicken pasta
ingredients = models.ManyToManyField(Ingredient, blank=True, Null=True, through='IngredientToRecipe')
class Ingredient(models.Model):
name = models.CharField(max_length=220)
class GlobalIngredient(Ingredient):
pass
class UserCreatedIngredient(Ingredient):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class IngredientToRecipe(models.Model):
ingredient = models.ForeignKey(Ingredient, on_delete=models.SET_NULL)
quantity = models.CharField(max_length=50, blank=True, null=True) # 400
unit = models.CharField(max_length=50, blank=True, null=True) # pounds, lbs, oz ,grams, etc
instructions = models.TextField(blank=True, null=True) # chopped, diced etc.
Разрешая такое наследование, вы можете улучшить избыточность данных.