Невозможно обновить/удалить элемент из таблицы даже при on_delete=CASCADE
Я пытаюсь создать БД портала кулинарных рецептов, и ни один из запросов DELETE не работает для меня.
Вот мои таблицы/модели, связанные с ошибкой:
class Ingredient(models.Model):
ingredientid = models.IntegerField(primary_key=True)
name = models.CharField(max_length=255)
type = models.CharField(max_length=255)
class IngredientRecipe(models.Model):
ingredientid = models.ForeignKey("Ingredient", to_field="ingredientid", on_delete=models.SET_NULL, null=True)
recipeid = models.ForeignKey("Recipe", to_field="recipeid", on_delete=models.SET_NULL, null=True)
amount = models.CharField(max_length=255)
class Meta:
unique_together = ("ingredientid", "recipeid")
class IngredientNutrition(models.Model):
nutritionid = models.IntegerField(null=True, blank=True)
ingredientid = models.ForeignKey("Ingredient", to_field="ingredientid", on_delete=models.CASCADE)
#ingredientid = models.OneToOneField(Ingredient, on_delete=models.CASCADE)
portionsize = models.FloatField(max_length=24)
calories = models.IntegerField()
fat = models.IntegerField()
protein = models.IntegerField()
sodium = models.IntegerField()
carbs = models.IntegerField()
class Meta:
unique_together = (("nutritionid", "ingredientid"), )
Вопрос: Скажем, я хочу удалить ingredient.ingredientID = 20 или ingredient.name = 'Corn Starch', он не позволяет мне удалить, потому что ingredientID = 20 все еще ссылается на таблицу IngredientNutrition. У меня on__delete=CASCADE.
Я попробовал изменить параметры внутри models.ForeignKey и изменил параметры в различных ключах в различных таблицах, чтобы посмотреть, позволит ли это мне удалить.
Сначала нужно удалить объект IngredientNutrition, который ссылается на объект Ingredient, который вы хотите удалить, затем можно удалить объект Ingredient obj
DELETE FROM recipeportaldb_IngredientNutrition
WHERE ingredientid = 20;
Тогда...
DELETE FROM recipeportaldb_ingredient
WHERE ingredientid = 20;
Если вы используете django для обработки этого, это можно сделать с помощью одной строки:
Ingredient.objects.get(ingredientid=20).delete()