执行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,不过此处根本不需要这个属性
解决步骤
修正外键默认值类型
修改Display_Data模型中的users字段,将默认值改为整数1:users= models.ForeignKey(UserProfile,on_delete=models.CASCADE,default=1)注意:需确保数据库中存在主键为1的UserProfile记录,否则后续创建Display_Data实例时会触发不存在的对象错误。
修正视图中的字段引用错误
调整视图函数中的用户信息获取逻辑:user_info = { 'user_nickname': latest_successful_record.users.user_nickname, 'url': latest_successful_record.users.nikename_url }重新生成并执行迁移
- 删除显示应用(display)目录下的所有迁移文件(保留
__init__.py) - 删除现有数据库,重新创建空数据库
- 依次执行以下命令:
python manage.py makemigrations display python manage.py migrate
- 删除显示应用(display)目录下的所有迁移文件(保留
完成以上步骤后,数据库会正确创建users_id字段,查询时的错误即可解决。
内容的提问来源于stack exchange,提问作者ashraf sadik
相关产品推荐
相关产品推荐

