Create model with Many to Many fields

Many to many field is just a repeatable foreign key field (recall foreign key is a one to many field)

Recipe model

Many to many fields to Tag and Ingredient

class Recipe(models.Model):
    """ Ingredient to be used in a recipe"""
    # one to many: one user for many recipies
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    title = models.CharField(max_length=255)
    time_miniutes = models.IntegerField()
    price = models.DecimalField(max_digits=5, decimal_places=2)

    # For optional fields, prefer blank over null.
    # If we set null, then in the code we have to check
    # for both null and empty str
    link = models.CharField(max_length=255, blank=True)

    # many to many field is just a repeatable foreign key field
    ingredients = models.ManyToManyField('Ingredient')
    tags = models.ManyToManyField('Tag')

    def __str__(self):
        return self.title

Creating objects of models with Many to Many fields

Many to many fields are initialized differently from other fields

recipe = Recipe.objects.create(user=self.user, title="sample", time_minutes=5, price=5.0)

    # using .add method
    recipe.tags.add(Tag.objects.create(self.user, "new tag")

    # using 'set' method, which takes in a query set
    recipe.ingredients.set(Ingredients.objects.filter(user=self.user))