首页 > 解决方案 > Can't I add a list to my models.py in django?

问题描述

I'm quite new in Django and in this project I need to manage information about a restaurant. The problem is that I can't add more than one ingredient required to a recipe

Photo of the problem

My models.py is this:

from django.db import models

# Create your models here.
    
class Ingredient(models.Model):
    name = models.CharField(max_length=35)
    quantity = models.IntegerField()
    unit = models.CharField(max_length=5)
    unit_price = models.FloatField()

    def __str__(self):
        return self.name

class MenuItem(models.Model):
    title = models.CharField(max_length=35)
    price = models.FloatField()
    example = models.ImageField()

    def __str__(self):
        return self.title

class RecipeRequirement(models.Model):
    menu_items = models.ForeignKey(MenuItem, default = 1,  on_delete=models.SET_DEFAULT)
    ingredient = models.CharField(max_length=35)
    quantity = models.FloatField()
    def __str__(self):
        return str(self.menu_items)


class Purchase(models.Model):
    menu_item = models.ForeignKey(MenuItem, default=1, on_delete=models.SET_DEFAULT)
    timestamp = models.DateTimeField()

    def __str__(self):
        return 'Purchase ' + str(self.menu_item) + str(self.timestamp)

After replacing ingredients = models.CharField() for ingredients = models.ManyToManyField() a list of all ingredients appear:

enter image description here

But when I add a new ingredient to my Ingredient model, it automatically appears in every single menu_item:

enter image description here

标签: pythondjangodjango-models

解决方案


You need to have a ManyToMany relationship in your RecipeRequirement model. This will allow you to select multiple ingredients for any one RecipeRequirement object. Read more here: Django ManyToMany Fields

class RecipeRequirement(models.Model):
    menu_items = models.ForeignKey(MenuItem, default = 1,  on_delete=models.SET_DEFAULT)
    ingredients = models.ManyToManyField(Ingredient)
    quantity = models.FloatField()

    def __str__(self):
        return str(self.menu_items)

推荐阅读