最近在学习《python 从入门到实战》第19章,在learning_logs中models 添加了topic的用户属性,即哪个用户登录后创建的topic,则此topic的owner属性为此登录用户,代码:owner=models.ForeignKey(User,on_delete=models.CASCADE),owner 是User的外键(pthon 版本3.7.4,django版本2.2.6 ),并且在makemigrations后出现了如下提示:

此时选择是‘1)’的选项,然后选择的用户ID为1,即ll_admin,此时即原有topic的归属用户ID为1,即ll_admin,在执行new_topic时出现了如下错误:

IntegrityError at /new_topic/ NOT NULL constraint failed: learning_logs_topic.owner_id,错误现场如下:

其中topic 的model 源码如下:

class Topic(models.Model) :
    text=models.CharField(max_length=200)
    date_added=models.DateTimeField(auto_now_add=True)
    owner=models.ForeignKey(User,on_delete=models.CASCADE)    
    def __str__(self) :
        return self.text

topicform的源码如下:

class TopicForm(forms.ModelForm):
    class Meta :
        model=Topic 
        fields =['text']
        labels={'text' : ''}

learning_logs 文件夹下views.py 的new_topic 源码如下:

def new_topic(request) :
    if request.method != 'POST' :
        form=TopicForm()
        
    else :
        form= TopicForm(request.POST)
        if form.is_valid() :
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topics'))
            
    context={'form':form}
    return render(request,'learning_logs/new_topic.html',context)

此错误显示空值限制错误:owner,owner是models里面刚添加的属性,虽然在已存在的topic添加了owner 属性,但新添加的topic没有owner属性,所以报错。

解决的过程如下:

(1)在models.py 属性添加null=True,即允许此属性为空

修改后变为owner=models.ForeignKey(User,on_delete=models.CASCADE,null=True),修改后错误不再出现,但新添加的topic的owner为NULL,非设计所愿

(2)在models.py 里面添加默认值。

修改后owner=models.ForeignKey(User,on_delete=models.CASCADE,default=1),修改后错误也不再出现,但新添加的topic的owner均为ID为1的用户,也非设计所愿

(3)修改TopicForm,添加owner 字段

修改后TopicForm 变为如下:

class TopicForm(forms.ModelForm):
    class Meta :
        model=Topic 
        fields =['text,‘owner’']
        labels={'text' : '','owner':''}

修改后将由用户选择此新建topic 的owner,如下所示:

虽然可以选择当前登录用户为此topic的owner ,但用户也可以选择其它非当前登录用户,增加了出现错误的风险

(4)在views.py new_topic视图里,用request.user 获取当前用户,并赋值给form

即在if form.is_valid() :后添加一行:

form.instance.owner=request.user,修改后变为:

def new_topic(request) :
    if request.method != 'POST' :
        form=TopicForm()
        
    else :
        form= TopicForm(request.POST)
        if form.is_valid() :
           form.instance.owner=request.user
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topics'))
            
    context={'form':form}
    return render(request,'learning_logs/new_topic.html',context)

即用Form的instance 参数,来获取owner 属性,并用requset.user得到的当前用户赋值给此instance的owner。修改后程序实现预定功能

(5)也是利用了instance参数,不过是在生成的Form的时候,修改后new_topic的视图如下:

def new_topic(request) :
    if request.method != 'POST' :
        form=TopicForm()
        
    else :
        form= TopicForm(request.POST)
        topic=Topic()
        topic.owner=request.user
        form= TopicForm(request.POST,instance=topic)
        if form.is_valid() :
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topics'))
            
    context={'form':form}
    return render(request,'learning_logs/new_topic.html',context)

先生成一个topic,然后赋值给owner,再将此topic赋值给instance参数,空间、时间成本较大,不过也实现了预定的功能。

IntegrityError at ** NOT NULL constraint failed: learning_logs_topic.owner_id相关推荐

  1. Flask报错:sqlite3.IntegrityError: NOT NULL constraint failed: step. date

    Flask报错:sqlite3.IntegrityError: NOT NULL constraint failed: step. date 报错如图 解决方法 报错如图 解决方法 开始: db=co ...

  2. sqlite3, IntegrityError: UNIQUE constraint failed when inserting a value

    sqlite报错: sqlite3.IntegrityError: UNIQUE constraint failed: IMAGESTATUE.ID 解决方案: Change INSERT to IN ...

  3. 数据库插入数据报错Unknown error finalizing or resetting statement (19: UNIQUE constraint failed:xxx.xxx)

    PRIMARY Key: 唯一标识数据库表中的各行/记录. NOT NULL: 确保某列不能有 NULL 值 UNIQUE: 确保某列中的所有值是不同的. 当插入相同的值时会报错: Unknown e ...

  4. android 数据库 unique,UNIQUE constraint failed: sqlite database : android

    可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 由 问题: I am trying to insert values in table. But th ...

  5. sqlite3:unique constraint failed xxx Frame.No

    最近在写一个项目发现第一次写入正常,第二次到执行execDML时就崩溃了. 因为是对sqliteC++版的封装,仔细一看代码也没问题 随着断点调试发现出错行在execDML 于是就进入源码看一下 最终 ...

  6. Host name may not be null registration failed Cannot execute request on any known server

    项目场景: Eureka客户端配置由IP改成域名变量 问题描述: 关键异常栈: Cannot execute request on any known server java.lang.Illegal ...

  7. 解决RocketMQ org.apache.rocketmq.remoting.execption.RemotingConnectException:connect to <null> failed

    本人安装RocketMQ参照文章: docker安装rocketmq 文章很详细,建议参考~ 但是可能还会有一点安装RocketMQ时遇到的问题!!! (1)org.apache.rocketmq.r ...

  8. Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <null>failed.

    参考解决方法: 我检查了下自己的日志发现:自己云服器的安全组未对自己的公网IP开放. 将自己的公网IP添加后解决.

  9. rest framework错误笔记——身份验证和权限

    按照官网教程(http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/)走到最后一步验证时,命令窗 ...

最新文章

  1. 【项目实践】车距+车辆+车道线+行人检测项目实践
  2. IDEA如何将git分支代码合并到master
  3. 如何在Win7以上环境使用VC++6
  4. thinkphp路由配置 php7.0,thinkphp3.2 路由设置方法
  5. 交叉编译openwrt php,构建 openwrt 交叉编译工具链
  6. 基于Kebernetes 构建.NET Core技术中台
  7. excel趋势线公式导出_如何用Excel进行预测分析?
  8. Android官方开发文档Training系列课程中文版:高效显示位图之在UI中展示位图
  9. oracle 存储过程 胡勇,Oracle SQL:经典查询练手第二篇
  10. 基于JAVA+Servlet+JSP+MYSQL的企业车库管理系统
  11. 二胎妈妈,35岁,年薪70万,家庭工作平衡太难,要不要辞职?
  12. linux系统基本特点分时,Linux操作系统四个优点.docx
  13. 软件安全测试方案设计模板-homin
  14. 如何批量将 Excel 文档转为 Json 格式
  15. dijistra算法
  16. Linux阅码场原创精华文章汇总
  17. 2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest
  18. x86架构学习内存管理的单元
  19. PAT乙级 1070 结绳
  20. vue3使用的移动端UI框架,vue一般用什么ui框架

热门文章

  1. Spark MLlib之K-Means聚类算法
  2. java 手机信息管理系统照相功能_Android实现手机拍照功能
  3. java多线程【线程常用方法】
  4. python程序设计搜题软件下载_智慧职教云课堂APPPython程序设计答案搜题公众号
  5. springboot filter_SpringBoot(二) :web综合开发
  6. oracle登录日志查看_last命令详解--查看Linux 登录日志+实例说明
  7. 2_python基础—格式化符号(输入、输出、转义、结束)
  8. Linux、Ubuntu、CentOS安装和配置zsh
  9. html语言 大全,HTML语言大全
  10. ios 模拟器沙盒_iOS模拟器的路径-打开沙盒路径