You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行makemigrations和migrate后,Django无法创建users_id字段的问题

问题描述

我在Django项目中定义了如下模型:

显示应用(display)的models.py

class Display(models.Model) :
    url=models.URLField(unique=True)
    text = models.CharField(max_length=150) 

class Display_Data(models.Model) :
    displays = models.ManyToManyField(Display,related_name='display_data')  
    users= models.ForeignKey(UserProfile,on_delete=models.CASCADE,default="1")
    choosenum=models.IntegerField()
    puplish_date =models.DateTimeField(default=datetime.now)  

账户应用(account)的models.py

class UserProfile(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)
    user_nickname=models.CharField(max_length=150)
    nikename_url=models.URLField()
    userphoto =models.ImageField(upload_to='imageprofile/%Y/%m/%d/')

显示应用的views.py查询函数

def check_url_exists_and_person(url_to_check):
    user_info_array = []

    for i in range(1, 6):
        latest_successful_record = Display_Data.objects.filter(displays__url=url_to_check,
        choosenum=i).order_by('-puplish_date').first()

        if latest_successful_record:
            user_info = {
                'user_nickname': latest_successful_record.users.userprofile.nikename,
                'url': latest_successful_record.users.userpofile.nikename_url
            }
        else:
            user_info = None

        user_info_array.append(user_info)

    return user_info_array

执行查询时收到Django错误提示:Unknown column 'display_display_data.users_id' in 'field list',回溯信息指向该查询语句。我已执行makemigrations和migrate操作,甚至新建数据库、删除相关应用的迁移文件,但数据库仍未创建users_id字段,请问原因是什么?


问题原因及解决办法

核心原因1:外键字段默认值类型不匹配

Display_Data模型中users字段的默认值设为字符串"1",但外键字段要求的是整数类型的主键值。这个错误会导致Django在生成迁移文件时出现异常,无法正确创建users_id字段。

核心原因2:视图代码存在拼写错误(额外问题)

视图函数里有两处明显的拼写错误:

  • 错误引用latest_successful_record.users.userprofile.nikename:UserProfile模型中定义的字段是user_nickname,且users本身就是UserProfile实例,无需再访问userprofile属性
  • 错误拼写userpofile:应为userprofile,不过此处根本不需要这个属性

解决步骤

  1. 修正外键默认值类型
    修改Display_Data模型中的users字段,将默认值改为整数1:

    users= models.ForeignKey(UserProfile,on_delete=models.CASCADE,default=1)
    

    注意:需确保数据库中存在主键为1的UserProfile记录,否则后续创建Display_Data实例时会触发不存在的对象错误。

  2. 修正视图中的字段引用错误
    调整视图函数中的用户信息获取逻辑:

    user_info = {
        'user_nickname': latest_successful_record.users.user_nickname,
        'url': latest_successful_record.users.nikename_url
    }
    
  3. 重新生成并执行迁移

    • 删除显示应用(display)目录下的所有迁移文件(保留__init__.py)
    • 删除现有数据库,重新创建空数据库
    • 依次执行以下命令:
      python manage.py makemigrations display
      python manage.py migrate
      

完成以上步骤后,数据库会正确创建users_id字段,查询时的错误即可解决。


内容的提问来源于stack exchange,提问作者ashraf sadik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:04:53