Как сохранить список объекта ModelBase в представлении (объект ModelBase недопустим) - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь создать приложение с 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

1 Ответ

1 голос
/ 25 апреля 2020

изменить det = FoodIngredient на det = FoodIngredient() первый создает экземпляр типа (объект ModelBase), а второй создает созданный экземпляр (запись в таблице FoodIngredient)

добавить det.save() для хранения новый экземпляр в базе данных. Без этого вызова ваши изменения не сохранятся

код не возвращает словарь или массив, поэтому ingredients.append(det[:]) необходимо переписать как ingredients.append(det)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...