django - 外键字段未在数据库中注册
问题描述
我在我的模型中添加了一个新的外键,但是一旦我迁移它就会出错。
字段 'id' 需要一个数字,但得到了 'XD'。
模型:
item_tool= models.ForeignKey(Tools,default='XD', on_delete=SET_DEFAULT)
班级:
class Tools(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = 'Tools'
def __str__(self):
return self.name
类别
class Categories(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = 'Categories'
def __str__(self):
return self.name
模型:
item_category = models.ForeignKey(Categories, default='Coding', on_delete=SET_DEFAULT)
解决方案
您不能设置default='XD'
,因为ForeignKey
期望或Tools
对象,或模型的主键来引用。
但是,您可以做的是传递对可调用对象的引用,该可调用对象将检索或创建Tools
具有名称的对象'XD'
:
def xd_tool():
return Tools.objects.get_or_create(name='XD')
class MyModel(models.Model):
item_tool = models.ForeignKey(Tools, default=xd_tool, on_delete=SET_DEFAULT)
我们可以通过在函数中缓存工具来提高效率,如果工具在某个时间点不XD
改变它们,你只能这样做:
def xd_tool():
cache = getattr(xd_tool, 'cache', None)
if cache is not None:
return cache
xd_tool.cache = cache = Tools.objects.get_or_create(name='XD')
return cache
我还建议使您的Tools
模型的名称独一无二,否则可能有两个同名的工具会引起很多混乱:
class Tools(models.Model):
name = models.CharField(max_length=200, unique=True)
class Meta:
verbose_name_plural = 'Tools'
def __str__(self):
return self.name
注意:通常 Django 模型被赋予一个单数名称,所以
Tool
而不是.Tools
推荐阅读
- html - CSS box-shadow 替代绘制逼真的云?
- python - 将值从一列移动到另一列
- javascript - Node.js fs.readFile 将读取的数据存储在内存中
- python - 对两个 pandas 列执行逐行操作
- reactjs - 提交时如何获取json数据的输入值
- postgresql - 分布式排序和分页
- java - 如何使用 Spring MVC 进行正确的重定向?
- ios - 在范围内找不到类型“GADRequestError”
- wso2 - wso2 api manager 2.6.0 Suspending endpoint : AnonymousEndpoint with address https://{uri.var.hostname}:{uri.var.portnum}/oauth2/token
- shopify - Shoppify include image with max height in liquid template