首页 > 解决方案 > 外键字段未在数据库中注册

问题描述

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

字段 '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)

标签: djangomodelfield

解决方案


您不能设置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.


推荐阅读