删除外键对象时,Django'str'对象不可调用

Posted

技术标签:

【中文标题】删除外键对象时,Django\'str\'对象不可调用【英文标题】:Django 'str' object is not callable when deleting a foreign key object删除外键对象时,Django'str'对象不可调用 【发布时间】:2019-04-12 07:52:23 【问题描述】:

我有一个模型,其外键指向另一个模型,当我尝试删除一个对象时(在本例中,存在 id=0 的对象)。

模型.py

​​>
class MyModel(models.Model):
    example = models.ForeignKey(OtherModel,related_name='example',on_delete=models.SET_NULL    ,blank=True,null=True)

class OtherModel(models.Model):
    name = models.CharField(max_length=250)

外壳

>>> import project
>>> from project import models
>>> project.models.OtherModel.objects.get(id=0).delete()
Traceback (most recent call last):
File "console", line 1, in "module"
File ".../lib/python3.5/site-packages/django/db/models/base.py"
, line 890, in delete collector.collect([self], keep_parents=keep_parents)
File ".../lib/python3.5/site-packages/django/db/models/deletion.py", line 222, in collect
field.remote_field.on_delete(self, field, sub_objs, self.using)
TypeError: 'str' object is not callable

【问题讨论】:

鉴于两个模型在同一个文件中,上述方法永远不会起作用,因为您引用的类此时尚未定义。 print(project.models.OtherModel.objects.get(id=0)) 告诉你什么? 不应该是id=1吗? Django ORM 从 1 开始 pk 好奇...MyModel._meta.get_field('example').remote_field.on_delete 返回什么,如果不是函数,返回什么类型? 嗨,我发现了我的错误,在另一个模型中,有人在引号中写了 on_delete 选项,这被认为是“str”。谢谢! 【参考方案1】:

您正在尝试使用尚未定义的模型创建外键关系。

example = models.ForeignKey(OtherModel,related_name='example',on_delete=models.SET_NULL ,blank=True,null=True)

这里Other模型定义在这条线下面,所以无法识别OtherModel是什么。

【讨论】:

嗨,我发现了我的错误,在另一个模型中,有人在引号中写了 on_delete 选项,这被认为是“str”。谢谢!

以上是关于删除外键对象时,Django'str'对象不可调用的主要内容,如果未能解决你的问题,请参考以下文章

外键约束,带有子对象集合的 EF

为什么在Django上使用bulk_create插入带有外键的数据会返回“属性对象不可调用”?

无法删除用户外部登录

获取请求导致父管理对象的外键为空

删除对象但将子项保留为孤儿而没有“外键约束失败”错误?

TypeError:'ResultSet'对象不可调用 - 带有BeautifulSoup的Python