当我在同一个模型中引用一个类时,为啥 Django 会给我一个 ValueError?

Posted

技术标签:

【中文标题】当我在同一个模型中引用一个类时,为啥 Django 会给我一个 ValueError?【英文标题】:Why is Django giving me a ValueError when I reference a class within the same model?当我在同一个模型中引用一个类时,为什么 Django 会给我一个 ValueError? 【发布时间】:2022-01-09 02:13:49 【问题描述】:

我正在构建一个简单的食谱应用程序,到目前为止我有两个模型:IngredientRecipe

每个食谱都应该有多种成分,所以我这样布置我的模型:

class Ingredient(models.Model):
    name = models.CharField(max_length=50)

class Recipe(models.Model):
    title = models.CharField(max_length=100)
    ingredients = models.ForeignKey(Ingredient, on_delete=CASCADE)
    instructions = JSONField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=SET_DEFAULT, default='Chef Anon')

当我进行迁移时,我什么也得不到,但是当我迁移时,我得到这个 ValueError:

ValueError: Cannot alter field cookbook.Recipe.ingredients into cookbook.Recipe.ingredients - they do not properly define db_type (are you using a badly-written custom field?)

按照此处的示例 (Django: Add foreign key in same model but different class),我尝试设置 ingredients=models.ForeignKey(Ingredient, on_delete=CASCADE) 以及使用惰性语法 ingredients=models.ForeignKey("Ingredient", on_delete=CASCADE),但每次,makemigrations 显示没有变化,migrate 给我相同ValueError.

编辑 我的进口:

from django.db.models.deletion import CASCADE, SET_DEFAULT, SET_NULL
from django.db.models.fields.json import JSONField
from django.utils import timezone
from django.contrib.auth.models import User```

【问题讨论】:

【参考方案1】:

尝试将on_delete=CASCADE 替换为on_delete=models.CASCADE

如果您尚未将CASCADEmodels 分开导入。

不过,在这种情况下,您应该会收到“未定义 CASCADE”的警告。

【讨论】:

抱歉,我忘记在顶部包含我的导入:from django.db.models.deletion import CASCADE【参考方案2】:

我相信我发现了问题:我的models.py 文件在根目录中,而不是在应用程序目录中。

【讨论】:

以上是关于当我在同一个模型中引用一个类时,为啥 Django 会给我一个 ValueError?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在修改引用的程序集时会重建其他程序集?

为啥我不能将 __getattr__ 与 Django 模型一起使用?

进行模型更改时,Django 依赖项引用不存在的父节点

为啥当我尝试在 celery 任务中使用模型时,django 会引发“应用程序尚未加载”错误?

为啥在使用带有量词的字符类时在反向引用中捕获最右边的字符?

为啥即使数据库中没有对象,django paginator.num_pages 也会返回一个?