外键字段没有在数据库中注册



我在我的模型中添加了一个新的外键,但是一旦我迁移,它会给出一个错误。

字段'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对象,或模型的主键要引用。

你可以做的是传递一个引用到一个可调用对象,它将检索或创建一个名称为'XD'Tools对象:

defxd_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)
ifcache 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.

最新更新