导读:今天首席CTO笔记来给各位分享关于django如何实现级联的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
django 2.0外键处理
Django2.0里model外键和一对一的on_delete参数
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
举例说明:
user=models.OneToOneField(User)
owner=models.ForeignKey(UserProfile)
需要改成:
user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值
owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。
下面是官方文档说明:
ForeignKey accepts other arguments that define the details of how the relation works.
ForeignKey.on_delete ¶
When an object referenced by a ForeignKey is deleted, Django will emulate the behavior of the SQL constraint specified by the on_delete argument. For example, if you have a nullable ForeignKey and you want it to be set null when the referenced object is deleted:
user=models.ForeignKey(User,models.SET_NULL,blank=True,null=True,)
Deprecated since version 1.9: on_delete will become a required argument in Django 2.0. In older versions it defaults toCASCADE.
The possible values for on_delete are found in django.db.models :
CASCADE [source] ¶
Cascade deletes. Django emulates the behavior of the SQL constraint ON DELETE CASCADE and also deletes the object containing the ForeignKey.
PROTECT [source] ¶
Prevent deletion of the referenced object by raising ProtectedError , a subclass of django.db.IntegrityError .
SET_NULL [source] ¶
Set the ForeignKey null; this is only possible if null isTrue.
SET_DEFAULT [source] ¶
Set the ForeignKey to its default value; a default for the ForeignKey must be set.
SET() [source] ¶
Set the ForeignKey to the value passed to SET() , or if a callable is passed in, the result of calling it. In most cases, passing a callable will be necessary to avoid executing queries at the time your models.py is imported:
fromdjango.confimportsettingsfromdjango.contrib.authimportget_user_modelfromdjango.dbimportmodelsdefget_sentinel_user():returnget_user_model().objects.get_or_create(username='deleted')[0]classMyModel(models.Model):user=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.SET(get_sentinel_user),)
DO_NOTHING [source] ¶
Take no action. If your database backend enforces referential integrity, this will cause an IntegrityError unless you manually add an SQLONDELETEconstraint to the database field.
ForeignKey.limit_choices_to ¶
Sets a limit to the available choices for this field when this field is rendered using aModelFormor the admin (by default, all objects in the queryset are available to choose). Either a dictionary, a Q object, or a callable returning a dictionary or Q object can be used.
For example:
staff_member=models.ForeignKey(User,on_delete=models.CASCADE,limit_choices_to={'is_staff':True},)
causes the corresponding field on theModelFormto list onlyUsersthat haveis_staff=True. This may be helpful in the Django admin.
The callable form can be helpful, for instance, when used in conjunction with the Pythondatetimemodule to limit selections by date range. For example:
deflimit_pub_date_choices():return{'pub_date__lte':datetime.date.utcnow()}limit_choices_to=limit_pub_date_choices
Iflimit_choices_tois or returns a Qobject , which is useful for complex queries , then it will only have an effect on the choices available in the admin when the field is not listed in raw_id_fields in theModelAdminfor the model.
Note
If a callable is used forlimit_choices_to, it will be invoked every time a new form is instantiated. It may also be invoked when a model is validated, for example by management commands or the admin. The admin constructs querysets to validate its form inputs in various edge cases multiple times, so there is a possibility your callable may be invoked several times.
用django怎么实现http长连接
长连接通常是给手机服务时用的。建议你先连接到tornado,再连接django。
同时还要修改数据库连接,将数据库连接改成连接池
请问用什么方式可以实现省市级联的效果呀 省市的数据是从数据库中查出来的
使用jquery的ajax方式从服务器加载json数据至客户端即可以实现省市级联的效果。
具体如下:
1)、页面初始化时,首先加载所有的省;
2)、选择省,ajax传送编码至服务器,服务器根据选中的省编码,返回省下所有的市。
这样就能动态实现了省市级联的效果了。
Django不级联删除问题,怎么解决
在不需要删除的一对一和外键中,添加on_delete=models.DO_NOTHING参数
去刘江的DJango教程看看把,免费的,而且项目实战很精彩。
怎么实现级联菜单?
对于一个多条件的查询,我们希望在选择了一个菜单项后,另外一个下拉菜单能够根据我们所选择的第一个菜单项显示其所有子菜单项。这就是本文提到的级联菜单问题。级联菜单实现的方法有很多,本文根据笔者所做的一个小实验,简单的介绍一下如何通过XML来实现级联菜单的功能。
首先要定义一个XML文件,用以存放级联菜单的信息,我们命名为query.xml,其代码如下:
?xml version="1.0" encoding="gb2312"?
info
course
text软件工程/text
value1/value
/course
course
text数据结构/text
value2/value
/course
course
text操作系统/text
value3/value
/course
course
text计算机组成原理/text
value4/value
/course
teacher
text张老师/text
value1/value
/teacher
teacher
text李老师/text
value2/value
/teacher
teacher
text刘老师/text
value3/value
/teacher
teacher
text王老师/text
value4/value
/teacher
class
text一班/text
value1/value
/class
class
text二班/text
value2/value
/class
class
text三班/text
value3/value
/class
class
text四班/text
value4/value
/class
/info
然后再创建一个HTML文件,命名为query.html
在query.html里,首先创建一个表单
form id="queryForm"
select id="keyword" name="keyword" onChange="showDetail()"
option value="default"default/option
option value="1"课程/option
option value="2"教师/option
option value="3"班级/option
/select
select id="content" name="content" onChange="showValue()"
option value="default"default/option
/select
/form
从上面的代码可以看出,当我们选择第一级菜单时,会触发showDetail方法,这是通过JavaScript来实现的,因此我们还需要定义一个showDetail方法,其实现代码如下:
function showDetail(){
var document_xml = new ActiveXObject("Microsoft.XMLDOM");
document_xml.load("query.xml"); //加载info.xml
var RootNode = document_xml.documentElement; //获得info.xml文档的根节点
var keyword = document.getElementByIdx("keyword").value;
var details; //用以存放二级菜单内容,是一个数组对象
var content = document.getElementByIdx("content");
content.options.length = 0;//先清空
if(keyword=="default"){
var option = new Option("default","default");
content.add(option);
}else{
if(keyword=="1"){
details = document_xml.getElementsByTagName_r("course");
}else if(keyword=="2"){
details = document_xml.getElementsByTagName_r("teacher");
}else if(keyword=="3"){
details = document_xml.getElementsByTagName_r("class");
}
for(var i=0;idetails.length;i++){
var xText = details[i].childNodes[0].firstChild.nodeValue; //获取文本
var xValue = details[i].childNodes[1].firstChild.nodeValue; //获取文本以应的值
var option = new Option(xText,xValue);
content.add(option);
}
}
}
从上面的代码可以看出,showDetail方法会根据一级菜单选项的不同显示对应的子菜单。这里涉及到通过JavaScript来读取xml文件的操作,可以参见源码的注释部分,记得结合xml文件里的内容一起看哦。
二级菜单显示出来之后,我们就可以进行选择了,选择之后,会调用showValue方法,把选到的子菜单项的value和text显示出来。showValue的定义如下:
function showValue(){
var content= document.getElementByIdx("content");
var contentText = content.options[content.selectedIndex].text; //获取text值
var contentValue = document.getElementByIdx("content").value; //获取文本
alert(contentValue+" "+contentText);
}
在这个方法里,要注意option当中text值的获取,它与select表单域的value的获取方式不大一样,详见代码及其注释。
把两个方法封装在head/head之间,记得要写上script language="javascript"和/script了,然后你直接打开query.xml就可以看到效果了。
不知是否对楼主有用,希望对楼主有所帮助。
如何设置主键和外键,实现级联更新,级联删除
主键
外键
索引
定义:
唯一标识一条记录,不能有重复的,不允许为空
表的外键是另一表的主键, 外键可以有重复的, 可以是空值
该字段没有重复值,但可以有一个空值
作用:
用来保证数据完整性
用来和其他表建立联系用的
是提高查询排序的速度
个数:
主键只能有一个
一个表可以有多个外键
一个表可以有多个惟一索引
设置索引
若要设置外键,在参照表(pc表) 和被参照表(parts表)中,相对应的两个字段必须都设置索引(index)。
对parts表:
ALTER TABLE parts ADD INDEX idx_model (model);
这句话的意思是,为parts表增加一个索引,索引建立在model字段上,给这个索引起个名字叫idx_model。
对pc表也类似:
ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);
定义外键
下面为两张表之间建立前面所述的那种“约束”。因为pc的CPU型号必须参照parts表中的相应型号,所以我们将pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其他表。
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);
级联操作
级联更新:更新主键时,外键也随之更新。
可以在定义外键的时候,在最后加入这样的关键字:
ON UPDATE CASCADE;
即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。
如果把这语句完整的写出来,就是:
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON UPDATE CASCADE;
级联删除:删除主键时,外键也随之删除。
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON DELETE CASCADE;
级联更新、删除:
on update cascade on delete cascade
结语:以上就是首席CTO笔记为大家介绍的关于django如何实现级联的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。