最近的Django项目中有复制记录的需求。数据库里有一张名为Party的表,记录用户创建的party,现在要让用户能够复制一个新的party。本身非常简单的一个功能,但运行的时候出错了。我以为是复制过程出错,所以测试了一下Django中复制记录可能遇到的情况(后来发现是其他代码的逻辑出了问题),结果整理如下。

1.Reset pk

在Django中复制一条记录最简单的方法应该是先取出这条记录,将它的主键设置为None,然后再保存一次。

 
 
 

Python

 
1
2
3
old_party = Party.objects.get(pk=1)
party.pk = None
party.save()

2.Keyword Arguments

如果某张表除了主键还有其他AutoField字段,就要换一种方式了,虽然也可以手动根据字段名将其指定为空,但直接遍历出字段名和相应的值,把其中的AutoField字段赋值为None会比较简单。

 
 
 

Python

 
1
2
3
4
5
6
7
8
data = {}
for f in old_party._meta.fields:
    if f.__class__.__name__ != 'AutoField':
        data[f.name] = getattr(old_party, f.name)
    else:
        data[f.name] = None
party = Party(**data)
party.save()

3.Deepcopy

Django没有直接复制记录的方法,但是Python提供了copy模块用来拷贝一个对象,所以也可以这样复制Django的记录:

 
 
 

Python

 
1
2
3
4
import copy
party = copy.deepcopy(old_party)
party.pk = None
party.save()

Except

在关系型数据库中,存在相关联的表是很常见的事。Django中有三种关系型字段:ForeignKey/ManyToManyField/OneToOneField,这些就是需要例外处理的情况了。

ForeignKey在数据库中是用整数型来存放id,所以只要清空主键,直接保存也不会出错。假设party有一个外键关联到creator,如果要把这个关联的外键也复制一份,可以直接Deepcopy:

 
 
 

Python

 
1
2
3
creator =  copy.deepcopy(party.creator)
creator.pk = None
creator.save()

OneToOneField一般都是处理用户Profile和其他比较特殊的数据,所以还没有遇到过要复制OneToOneField的情况,纯测试了一下,前面提供的方法就可以解决,这里就不赘述了。

ManyToManyField比较特殊,关联的一般是多条记录,需要做一些处理:

 
 
 

Python

 
1
2
3
4
creator = party.creator.all()
party.pk = None
party.save()
party.creator = creator

Django复制记录的方法的更多相关文章

  1. django查询表记录的十三种方法

    django查询表记录的十三种方法 all() 结果为queryset类型 >>> models.Book.objects.all() <QuerySet [<Book: ...

  2. MySQL把多个字段合并成一条记录的方法

    转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...

  3. Django ORM记录的增删改查结合web端

    模版语法分配变量 在views.py文件中定义一个视图函数show_data: def show_data(request): # 定义一个字典 并将它展示在前端HTML文件 user_dic = { ...

  4. 【SQLServer】“无法对数据库’XXX’ 执行删除,因为它正用于复制”的解决方法

    警告: 一个或多个现有列的 ANSI_PADDING 设置为 "off",将以 ANSI_PADDING 为 "on" 的设置重新创建 [SQLServer]& ...

  5. paip.取当天记录的方法sql跟hql hibernate

    paip.取当天记录的方法sql跟hql hibernate #------两个方法...函数法和日期计算法.. 函数法: DATEDIFF(d,createTime,GETDATE())=0   / ...

  6. MySQL查询及删除重复记录的方法

    查询及删除重复记录的方法(一)1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select p ...

  7. php不使用copy()函数复制文件的方法

    本文实例讲述了php不使用copy()函数复制文件的方法.分享给大家供大家参考.具体如下:下面的代码不使用php内置的copy函数,直接通过文件读取写入的操作方式复制文件 <?php funct ...

  8. MySQL删除重复记录的方法

    参考网上的方法,总结了产出重复记录的方法,欢迎交流. 参考:http://www.cnblogs.com/nzbbody/p/4470638.html 方法1:创建一个新表临时储存数据 假设我们有一个 ...

  9. 用一条SQL语句取出第 m 条到第 n 条记录的方法

    原文:用一条SQL语句取出第 m 条到第 n 条记录的方法   --从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本)       *    FROM Table     id ...

随机推荐

  1. 线程安全之 synchronized 和 ReentrantLock

    线程安全之 synchronized 和 ReentrantLock + 面试题 前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题.线程安全问题指的是在 ...

  2. css- :before :after

    :before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example:before { conte ...

  3. CCF_ 201512-4_送货

    一道拖了很久了题,用bool开的vis不会爆内存,dfs回溯的话会超时,于是有了一个很巧妙的dfs. #include<iostream> #include<cstring> ...

  4. HDU_2579_bfs

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2579 简单bfs题,刚开始在纠结怎么存放vis,因为步数可能有几百步,这么多格子开数组的话也太多了, ...

  5. ARTS Week 9

    Dec 23, 2019 ~ Dec 29, 2019 Algorithm Problem 69 Sqrt(x) 实现求解平方根函数Sqrt(x) 题目链接 题目描述:给定一个非负数x,求解该数字的平 ...

  6. Dubbo 服务 IP 注册错误踩坑经历

    个人博客地址 studyidea.cn,点击查看更多原创文章 踩坑 公司最近新建一个机房,需要将现有系统同步部署到新机房,部署完成之后,两地机房同时对提供服务.系统架构如下图: 这个系统当前对外采用 ...

  7. SpringMVC之Controller层最佳实践

    规范设置接口, 有利于项目的可扩展性,提高前后端的交互特性. 请求参数 响应结果

  8. 大数据篇:Zookeeper

    Zookeeper 1 Zookeeper概念 Zookeeper是什么 是一个基于观察者设计模式的分布式服务管理框架,它负责和管理需要关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Z ...

  9. 【Debian】 Debian 安装源配置

    Debian 安装源配置 所有的Linux安装完后第一件事,就是要更新安装源 安装源是什么呢,安装源又称软件源,是指把软件的安装源地址放在一个pool里面,用一条命令(比如apt-get instal ...

  10. windows10 CTCP

    windows上除了普通tcp之外,有一个CTCP. 据说可以提升长延时情况下的吞吐量. win7可以方便的通过netsh int tcp set global congestionprovider= ...