发布网友 发布时间:2024-09-29 05:45
共1个回答
热心网友 时间:2024-12-14 01:08
导读:今天首席CTO笔记来给各位分享关于django如何实现级联的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
django2.0外键处理Django2.0里model外键和一对一的on_delete参数
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
TypeError:__init__()missing1requiredpositionalargument:'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就可以了。
下面是官方文档说明:
ForeignKeyacceptsotherargumentsthatdefinethedetailsofhowtherelationworks.
ForeignKey.on_delete?
WhenanobjectreferencedbyaForeignKeyisdeleted,DjangowillemulatethebehavioroftheSQLconstraintspecifiedbytheon_deleteargument.Forexample,ifyouhaveanullableForeignKeyandyouwantittobesetnullwhenthereferencedobjectisdeleted:
user=models.ForeignKey(User,models.SET_NULL,blank=True,null=True,)
Deprecatedsinceversion1.9:on_deletewillbecomearequiredargumentinDjango2.0.InolderversionsitdefaultstoCASCADE.
Thepossiblevaluesforon_deletearefoundindjango.db.models:
CASCADE[source]?
Cascadedeletes.DjangoemulatesthebehavioroftheSQLconstraintONDELETECASCADEandalsodeletestheobjectcontainingtheForeignKey.
PROTECT[source]?
PreventdeletionofthereferencedobjectbyraisingProtectedError,asubclassofdjango.db.IntegrityError.
SET_NULL[source]?
SettheForeignKeynull;thisisonlypossibleifnullisTrue.
SET_DEFAULT[source]?
SettheForeignKeytoitsdefaultvalue;adefaultfortheForeignKeymustbeset.
SET()[source]?
SettheForeignKeytothevaluepassedtoSET(),orifacallableispassedin,theresultofcallingit.Inmostcases,passingacallablewillbenecessarytoavoidexecutingqueriesatthetimeyourmodels.pyisimported:
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]?
Takenoaction.Ifyourdatabasebackendenforcesreferentialintegrity,thiswillcauseanIntegrityErrorunlessyoumanuallyaddanSQLONDELETEconstrainttothedatabasefield.
ForeignKey.limit_choices_to?
SetsalimittotheavailablechoicesforthisfieldwhenthisfieldisrenderesingaModelFormortheadmin(bydefault,allobjectsinthequerysetareavailabletochoose).Eitheradictionary,aQobject,oracallablereturningadictionaryorQobjectcanbeused.
Forexample:
staff_member=models.ForeignKey(User,on_delete=models.CASCADE,limit_choices_to={'is_staff':True},)
causesthecorrespondingfieldontheModelFormtolistonlyUsersthathaveis_staff=True.ThismaybehelpfulintheDjangoadmin.
Thecallableformcanbehelpful,forinstance,whenusedinconjunctionwiththePythondatetimemoletolimitselectionsbydaterange.Forexample:
deflimit_pub_date_choices():return{'pub_date__lte':datetime.date.utcnow()}limit_choices_to=limit_pub_date_choices
Iflimit_choices_toisorreturnsaQobject,whichisusefulforcomplexqueries,thenitwillonlyhaveaneffectonthechoicesavailableintheadminwhenthefieldisnotlistedinraw_id_fieldsintheModelAdminforthemodel.
Note
Ifacallableisusedforlimit_choices_to,itwillbeinvokedeverytimeanewformisinstantiated.Itmayalsobeinvokedwhenamodelisvalidated,forexamplebymanagementcommandsortheadmin.Theadminconstructsquerysetstovalidateitsforminputsinvariousedgecasesmultipletimes,sothereisapossibilityyourcallablemaybeinvokedseveraltimes.
用django怎么实现http长连接长连接通常是给手机服务时用的。建议你先连接到tornado,再连接django。
同时还要修改数据库连接,将数据库连接改成连接池
请问用什么方式可以实现省市级联的效果呀省市的数据是从数据库中查出来的
使用jquery的ajax方式从服务器加载json数据至客户端即可以实现省市级联的效果。
具体如下:
1)、页面初始化时,首先加载所有的省;
2)、选择省,ajax传送编码至服务器,服务器根据选中的省编码,返回省下所有的市。
这样就能动态实现了省市级联的效果了。
Django不级联删除问题,怎么解决在不需要删除的一对一和外键中,添加on_delete=models.DO_NOTHING参数
去刘江的DJango教程看看把,免费的,而且项目实战很精彩。
怎么实现级联菜单?对于一个多条件的查询,我们希望在选择了一个菜单项后,另外一个下拉菜单能够根据我们所选择的第一个菜单项显示其所有子菜单项。这就是本文提到的级联菜单问题。级联菜单实现的方法有很多,本文根据笔者所做的一个小实验,简单的介绍一下如何通过XML来实现级联菜单的功能。
首先要定义一个XML文件,用以存放级联菜单的信息,我们命名为query.xml,其代码如下:
?xmlversion="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里,首先创建一个表单
formid="queryForm"
selectid="keyword"name="keyword"onChange="showDetail()"
optionvalue="default"default/option
optionvalue="1"课程/option
optionvalue="2"教师/option
optionvalue="3"班级/option
/select
selectid="content"name="content"onChange="showValue()"
optionvalue="default"default/option
/select
/form
从上面的代码可以看出,当我们选择第一级菜单时,会触发showDetail方法,这是通过JavaScript来实现的,因此我们还需要定义一个showDetail方法,其实现代码如下:
functionshowDetail(){
vardocument_xml=newActiveXObject("Microsoft.XMLDOM");
document_xml.load("query.xml");//加载info.xml
varRootNode=document_xml.documentElement;//获得info.xml文档的根节点
varkeyword=document.getElementByIdx("keyword").value;
vardetails;//用以存放二级菜单内容,是一个数组对象
varcontent=document.getElementByIdx("content");
content.options.length=0;//先清空
if(keyword=="default"){
varoption=newOption("default","default");
content.add(option);
}else{
if(keyword=="1"){
details=document_xml.getElementsByTagName_r("course");
}elseif(keyword=="2"){
details=document_xml.getElementsByTagName_r("teacher");
}elseif(keyword=="3"){
details=document_xml.getElementsByTagName_r("class");
}
for(vari=0;idetails.length;i++){
varxText=details[i].childNodes[0].firstChild.nodeValue;//获取文本
varxValue=details[i].childNodes[1].firstChild.nodeValue;//获取文本以应的值
varoption=newOption(xText,xValue);
content.add(option);
}
}
}
从上面的代码可以看出,showDetail方法会根据一级菜单选项的不同显示对应的子菜单。这里涉及到通过JavaScript来读取xml文件的操作,可以参见源码的注释部分,记得结合xml文件里的内容一起看哦。
二级菜单显示出来之后,我们就可以进行选择了,选择之后,会调用showValue方法,把选到的子菜单项的value和text显示出来。showValue的定义如下:
functionshowValue(){
varcontent=document.getElementByIdx("content");
varcontentText=content.options[content.selectedIndex].text;//获取text值
varcontentValue=document.getElementByIdx("content").value;//获取文本
alert(contentValue+""+contentText);
}
在这个方法里,要注意option当中text值的获取,它与select表单域的value的获取方式不大一样,详见代码及其注释。
把两个方法封装在head/head之间,记得要写上scriptlanguage="javascript"和/script了,然后你直接打开query.xml就可以看到效果了。
不知是否对楼主有用,希望对楼主有所帮助。
如何设置主键和外键,实现级联更新,级联删除主键
外键
索引
定义:
唯一标识一条记录,不能有重复的,不允许为空
表的外键是另一表的主键,外键可以有重复的,可以是空值
该字段没有重复值,但可以有一个空值
作用:
用来保证数据完整性
用来和其他表建立联系用的
是提高查询排序的速度
个数:
主键只能有一个
一个表可以有多个外键
一个表可以有多个惟一索引
设置索引
若要设置外键,在参照表(pc表)和被参照表(parts表)中,相对应的两个字段必须都设置索引(index)。
对parts表:
ALTERTABLEpartsADDINDEXidx_model(model);
这句话的意思是,为parts表增加一个索引,索引建立在model字段上,给这个索引起个名字叫idx_model。
对pc表也类似:
ALTERTABLEpcADDINDEXidx_cpumodel(cpumodel);
定义外键
下面为两张表之间建立前面所述的那种“约束”。因为pc的CPU型号必须参照parts表中的相应型号,所以我们将pc表的cpumodel字段设置为“外键”(FOREIGNKEY),即这个键的参照值来自于其他表。
ALTERTABLEpcADDCONSTRAINTfk_cpu_model
FOREIGNKEY(cpumodel)
REFERENCESparts(model);
级联操作
级联更新:更新主键时,外键也随之更新。
可以在定义外键的时候,在最后加入这样的关键字:
ONUPDATECASCADE;
即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。
如果把这语句完整的写出来,就是:
ALTERTABLEpcADDCONSTRAINTfk_cpu_model
FOREIGNKEY(cpumodel)
REFERENCESparts(model)
ONUPDATECASCADE;
级联删除:删除主键时,外键也随之删除。
ALTERTABLEpcADDCONSTRAINTfk_cpu_model
FOREIGNKEY(cpumodel)
REFERENCESparts(model)
ONDELETECASCADE;
级联更新、删除:
onupdatecascadeondeletecascade
结语:以上就是首席CTO笔记为大家介绍的关于django如何实现级联的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。