亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

django有外鍵關(guān)系的兩張表如何相互查找

 更新時(shí)間:2020年02月10日 11:46:41   作者:xushukui  
這篇文章主要介紹了django有外鍵關(guān)系的兩張表如何相互查找,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了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)文章

最新評(píng)論