Как обрабатывать ингредиенты рецепта в базе данных

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

  • Иметь глобальные ингредиенты для рецептов, т.е. общие ингредиенты, курица, говядина и т.д.
  • Разрешить пользователям создавать свои собственные ингредиенты (только для этого пользователя), например, большой помидор
  • .
  • Прикреплять ингредиенты к рецепту независимо от того, являются ли они глобальными или созданными пользователем
  • .
  • Позволяет пользователям добавлять ингредиенты в свою кладовую и указывать, сколько ингредиентов у них есть в наличии

Ниже приведено то, что я думаю, что модели хотели бы получить, но я не уверен, что это правильно или лучший метод, любой совет приветствуется.

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.

Разрешая такое наследование, вы можете улучшить избыточность данных.

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