溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2020-09-05 14:16:31 來源:腳本之家 閱讀:111 作者:xushukui 欄目:開發(fā)技術(shù)

這篇文章主要介紹了django有外鍵關(guān)系的兩張表如何相互查找,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

兩張通過外鍵聯(lián)系的表,如何在一張表上根據(jù)另一張表上的屬性查找滿足條件的對象集?

平常查找表中數(shù)據(jù)的條件是python中已有的數(shù)據(jù)類型,通過名字可以直接查找。如果條件是表中外鍵列所對應(yīng)表的某一列,該如何查詢數(shù)據(jù)?

表1是新聞表,是回復(fù)表中某一外鍵指向的表,表2是回復(fù)表。

問題1:根據(jù)表1的某些條件來查找表2的對象集。

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ù)表,想要查找對于新聞id是3的所有回復(fù)?

方法一、首先獲得外鍵指向的表中對象,然后通過‘_set'這樣的方法獲得目標(biāo)表中的數(shù)據(jù)。

obj = models.News.objects.get(id=3)
replys = obj.reply_set.all()

方法二、直接在目標(biāo)表中通過雙下劃線來指定外鍵對應(yīng)表中的域來查找符合條件的對象。

models.Reply.objects.filter(newID__id=3)

問題2: 根據(jù)表2的某些條件查找表1的對象集。此時需要將表2的名字小寫加兩個下劃線,再加上查找條件。比如:查找回復(fù)內(nèi)容中包含“new”的所有新聞

models.News.objects.filter(reply__content__contains='new');

在filter中可以這樣用,在values方法中也可以這樣使用,此時的值便是外鍵對應(yīng)表中的數(shù)據(jù)。

2.在使用django中避免不了要跟前臺進(jìn)行數(shù)據(jù)交互,而python中的數(shù)據(jù)類型豐富,比如datetime模塊的datetime類型就不可以json編碼,如果想要繼續(xù)json格式化,有兩種方法可以解決,

1)使用django提供的格式化

2)自己編寫編碼器或默認(rèn)處理函數(shù)。

注意:pyhton中json只會編碼python中自己的數(shù)據(jù)類型,比如數(shù)字、字符串、元組、列表、字典等。在django中處理數(shù)據(jù)經(jīng)常遇到queryset這類數(shù)據(jù),需要先將他轉(zhuǎn)化成列表再json編碼。[list(queryset)]
方法一、所以需要更強勁的django.core提供的serializers.serialize方法,一般使用json格式就是serializers.serialize('json',data)??梢院芊奖愕膶jango中所有數(shù)據(jù)類型進(jìn)行json格式編碼。

方法二、自己編寫編碼器或者寫默認(rèn)處理函數(shù)

1)寫自己的編碼器類

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)寫自己的默認(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);

對其進(jìn)行測試

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);

測試結(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"]

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI