Я пытаюсь создать приложение с Django, где вы можете создавать различные продукты на основе ингредиентов, которые вы могли ранее создать.
Способ, которым пользователь делает это, выбирая каждый Ingredient
для Food
. Обратите внимание, что каждый запрос Ingredient
отправляет один запрос.
models.py:
class Ingredient(models.Model):
"""User selects different instances of this model, to build instances of FoodDetail, it can be, for instance: 'Meat'."""
account = models.ForeignKey(Account, on_delete=models.CASCADE, null=False)
code = models.CharField(max_length=20, null=False, blank=False)
name = models.CharField(max_length=100, null=False, blank=False)
cost = models.DecimalField(max_digits=14, decimal_places=2, null=False, default=0.00)
stock = models.DecimalField(max_digits=14, decimal_places=3, null=False, default=0.000)
class Food(models.Model):
"""The new food the user will create once it has finished the Ingredients selection. For instance, 'Burger'."""
account = models.ForeignKey(Account, on_delete=models.CASCADE, null=False)
name = models.CharField(max_length=100, null=False, blank=False)
price = models.DecimalField(max_digits=14, decimal_places=2, null=False)
class FoodIngredient(models.Model):
"""Instance of an ingredient (e.g. 'Bread') of a specific instance of Food (e.g. 'Burger')."""
food = models.ForeignKey(Food, on_delete=models.CASCADE, null=False)
ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE, null=False)
quantity = models.DecimalField(max_digits=14, decimal_places=3, default=0.000, null=False)
Таким образом, вы можете создавать любые ингредиенты, а затем использовать их для создания различных продуктов. Теперь представьте, что пользователь отправляет один FoodIngredient
за запрос, и мне нужно накапливать их в view
, чтобы я мог отправить новый Food
с FoodIngredient
s в базу данных за одну транзакцию.
Я получаю ошибку:
TypeError at /Foods/creation
'ModelBase' object is not subscriptable
Код, который создает эту проблему:
def get_ingredients_in_session(request):
ingredients = [] # The list to be returned
if 'ingredients' in request.session and request.session['ingredients'].__len__() > 0:
for k, v in request.session['ingredients'].items(): # k is the ingredient id and v is the quantity chosen
ingredient = Ingredient.objects.get(account__id=request.session['id_account'], id=k)
det = build_det(ingredient, v) # This function builds a FoodIngredient from an Ingredient and returns it to the variable 'det'
ingredients.append(det[:]) # This line is having the error
return ingredients
Эта функция используется для отображения в view
краткое описание ингредиентов (и их количества), которые пользователь в настоящее время выбирает для своего нового Food
. Как я могу решить это? Сохраните мой проект и не дайте мне перейти в Spring ... (ха-ха)
РЕДАКТИРОВАТЬ: Опубликовать функцию build_det.
def build_det(ingredient, v):
det = FoodIngredient
det.ingredient = ingredient
det.quantity = Decimal(v)
return det