django有外鍵關(guān)系的兩張表如何相互查找
這篇文章主要介紹了django有外鍵關(guān)系的兩張表如何相互查找,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
兩張通過(guò)外鍵聯(lián)系的表,如何在一張表上根據(jù)另一張表上的屬性查找滿足條件的對(duì)象集?
平常查找表中數(shù)據(jù)的條件是python中已有的數(shù)據(jù)類型,通過(guò)名字可以直接查找。如果條件是表中外鍵列所對(duì)應(yīng)表的某一列,該如何查詢數(shù)據(jù)?
表1是新聞表,是回復(fù)表中某一外鍵指向的表,表2是回復(fù)表。
問(wèn)題1:根據(jù)表1的某些條件來(lái)查找表2的對(duì)象集。
class News(models.Model): title = models.CharField(max_length=50); summary = models.TextField(); url = models.CharField(max_length=150); favorCount = models.IntegerField(default=0); favorUsername = models.TextField(default=""); replyCount = models.IntegerField(default=0); class Reply(models.Model): content = models.TextField(); user = models.ForeignKey('User'); newID = models.ForeignKey('News'); replyTime = models.DateTimeField(auto_now_add=True); def __unicode__(self): return self.content;
像這樣的數(shù)據(jù)表,想要查找對(duì)于新聞id是3的所有回復(fù)?
方法一、首先獲得外鍵指向的表中對(duì)象,然后通過(guò)‘_set'這樣的方法獲得目標(biāo)表中的數(shù)據(jù)。
obj = models.News.objects.get(id=3) replys = obj.reply_set.all()
方法二、直接在目標(biāo)表中通過(guò)雙下劃線來(lái)指定外鍵對(duì)應(yīng)表中的域來(lái)查找符合條件的對(duì)象。
models.Reply.objects.filter(newID__id=3)
問(wèn)題2: 根據(jù)表2的某些條件查找表1的對(duì)象集。此時(shí)需要將表2的名字小寫(xiě)加兩個(gè)下劃線,再加上查找條件。比如:查找回復(fù)內(nèi)容中包含“new”的所有新聞
models.News.objects.filter(reply__content__contains='new');
在filter中可以這樣用,在values方法中也可以這樣使用,此時(shí)的值便是外鍵對(duì)應(yīng)表中的數(shù)據(jù)。
2.在使用django中避免不了要跟前臺(tái)進(jìn)行數(shù)據(jù)交互,而python中的數(shù)據(jù)類型豐富,比如datetime模塊的datetime類型就不可以json編碼,如果想要繼續(xù)json格式化,有兩種方法可以解決,
1)使用django提供的格式化
2)自己編寫(xiě)編碼器或默認(rèn)處理函數(shù)。
注意:pyhton中json只會(huì)編碼python中自己的數(shù)據(jù)類型,比如數(shù)字、字符串、元組、列表、字典等。在django中處理數(shù)據(jù)經(jīng)常遇到queryset這類數(shù)據(jù),需要先將他轉(zhuǎn)化成列表再json編碼。[list(queryset)]
方法一、所以需要更強(qiáng)勁的django.core提供的serializers.serialize方法,一般使用json格式就是serializers.serialize('json',data)??梢院芊奖愕膶jango中所有數(shù)據(jù)類型進(jìn)行json格式編碼。
方法二、自己編寫(xiě)編碼器或者寫(xiě)默認(rèn)處理函數(shù)
1)寫(xiě)自己的編碼器類
class MyJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return (datetime.timedelta(hours=8)+obj).strftime('%Y-%m-%d %H:%M:%S'); elif isinstance(obj, datetime.date): return obj.strftime("%Y-%m-%d") else: return json.JSONEncoder.default(self, obj)
2)寫(xiě)自己的默認(rèn)處理函數(shù)
def myDumps(obj): if isinstance(obj, datetime.datetime): return (datetime.timedelta(hours=8)+obj).strftime('%Y-%m-%d %H:%M:%S'); else: return json.dumps(obj);
對(duì)其進(jìn)行測(cè)試
t = datetime.datetime.utcnow(); a=[1,2,43,56]; print json.dumps(t,default=myDumps); print json.dumps(a,default=myDumps); a.extend([t,t+datetime.timedelta(hours=8)]); print json.dumps(t,default=myDumps); print json.dumps(a,cls=MyJSONEncoder);
測(cè)試結(jié)果
"2016-06-26 09:53:03" [1, 2, 43, 56] "2016-06-26 09:53:03" [1, 2, 43, 56, "2016-06-26 09:53:03", "2016-06-26 17:53:03"]
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Pytorch數(shù)據(jù)讀取之Dataset和DataLoader知識(shí)總結(jié)
Dataset和DataLoader都是Pytorch里面讀取數(shù)據(jù)的工具.現(xiàn)在對(duì)這兩種工具做一個(gè)概括和總結(jié),對(duì)正在學(xué)習(xí)Pytorch的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05django rest framework serializer返回時(shí)間自動(dòng)格式化方法
這篇文章主要介紹了django rest framework serializer返回時(shí)間自動(dòng)格式化方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python:type、object、class與內(nèi)置類型實(shí)例
今天小編就為大家分享一篇Python:type、object、class與內(nèi)置類型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12pytorch中常用的損失函數(shù)用法說(shuō)明
這篇文章主要介紹了pytorch中常用的損失函數(shù)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python實(shí)現(xiàn)電子產(chǎn)品商店
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)電子產(chǎn)品商店,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Python3里的super()和__class__使用介紹
這篇文章主要介紹了Python3里的super()和__class__使用介紹,本文用實(shí)例講解了這兩個(gè)方法之間的關(guān)系,需要的朋友可以參考下2015-04-04對(duì)Python中列表和數(shù)組的賦值,淺拷貝和深拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)Python中列表和數(shù)組的賦值,淺拷貝和深拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06python3.6.4安裝opencv3.4.2的實(shí)現(xiàn)
這篇文章主要介紹了python3.6.4安裝opencv3.4.2的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10