我在django的moles中建立了兩個calss,以下:
python
class Project(models.Model): name = models.CharField(u'項目名稱',max_length=32,blank=True) id = models.CharField(u'項目ID',max_length=32,unique=True,primary_key=True,blank=True) create_date = models.DateTimeField(u'建立時間', auto_now_add=True) update_date = models.DateTimeField(u'更新時間', auto_now=True) def __unicode__(self): return self.name class Uhost(models.Model): name = models.CharField(u'計算機名',max_length=32,blank=False) id = models.CharField(u'實例ID',max_length=32,blank=False,primary_key=True) ip = models.GenericIPAddressField(u'IP地址',blank=True,null=True) project = models.ForeignKey(Project,verbose_name=u'所屬項目',db_constraint=False,on_delete=models.DO_NOTHING,blank=True) create_date = models.DateTimeField(u'建立時間', auto_now_add=True) update_date = models.DateTimeField(u'更新時間', auto_now=True) def __unicode__(self): return self.name
首先咱們要理解兩個概念==> Object對象和QuerySet查詢集
web
Object對象:數據庫
一個object對象就是表中的一條數據,表中全部的字段它都有。例如我取Uhost表中的第一個對象django
>>> host = Uhost.objects.all()[0] >>> print type(host) <class 'ucloud.models.Uhost'>
對象獲取某個值使用「.」bash
例如:async
>>> host.id u'uhost-3th2rp' >>> host.ip u'10.6.13.253' >>> host.project <Project: CPMS10>
注意:Uhost表中project字段是一個ForeighKey,當獲取host.project時,獲取到的結果是一個對象ide
咱們還能夠獲取這個對象其餘值,好比Project表中定義了name、id、create_time、update_time四個字段,咱們能夠經過下面的方式獲取spa
>>> host.project.name u'CPMS10' >>> host.project.id u'org-81' >>> host.project.create_date datetime.datetime(2017, 3, 6, 12, 21, 7, 296546) >>> host.project.update_date datetime.datetime(2017, 5, 19, 16, 19, 8, 925978)
總結:對象獲取某一列值(或者說是獲取某個屬性)的時候,使用點來獲取。咱們跨表查詢時,也是使用點來獲取。code
上面的例子中,咱們獲取host的project值還能夠使用下面這種方式獲取:對象
>>> host.project_id u'org-81' >>> host.project_name Traceback (most recent call last): File "<console>", line 1, in <module> AttributeError: 'Uhost' object has no attribute 'project_name'
這裏咱們之因此能獲取到project_id這個字段的值是由於,在Uhost表中project字段是ForeignKey,而在數據庫中被設置了外鍵的列,在數據庫中的字段名就是本表中的列名 +「_「」+被設置外鍵的表的那個字段名,而Project表中id是primary_key,因此id列被設置了外鍵 。
由上可知,host.project.id是跨表查詢,而host.project_id並非跨表查詢。由於這個字段在本身表中。
QuerySet查詢集:
查詢集是一組數據的集合,跟python的list基本同樣的。例如獲取如下方法能夠獲取Uhost表中全部對象的ip和name。
>>> host2 = Uhost.objects.all().values('ip','name') >>> print type(host2) <class 'django.db.models.query.ValuesQuerySet'> [{'ip': u'10.6.13.253', 'name': u'dbbackupsyncer2'}, {'ip': u'10.6.30.43', 'name': u'SRV-CPMS10-WEB16'}, {'ip': u'10.6.20.189', 'name': u'SRV-CPMS10-WEB15'}, {'ip': u'10.6.14.232', 'name': u'publicconsole'}, {'ip': u'10.6.10.236', 'name': u'SRV-CPMS10-WEB14'}, {'ip': u'10.6.10.159', 'name': u'dbbackupsyncer'}, {'ip': u'10.6.11.73', 'name': u'\u5b98\u7f51'}, {'ip': u'10.6.7.170', 'name': u'99exchangedb'}, {'ip': u'10.6.5.22', 'name': u'dc1'}, {'ip': u'10.6.3.243', 'name': u'dc2'}, {'ip': u'10.6.2.213', 'name': u'publicweb'}, {'ip': u'10.6.8.163', 'name': u'SRV-CPMS10-WEB13'}, {'ip': u'10.10.16.165', 'name': u'SRV-OTA10-WS04'}, {'ip': u'10.10.31.79', 'name': u'SRV-OTA10-WS05'}, {'ip': u'10.10.187.86', 'name': u'SRV-OTA10-WS03'}, {'ip': u'10.10.102.32', 'name': u'SRV-OTA10-WEB04'}, {'ip': u'10.10.107.144', 'name': u'SRV-OTA10-WEB03'}, {'ip': u'10.10.112.46', 'name': u'99datasyncer'}, {'ip': u'10.10.48.121', 'name': u'SRV-CPMS10-WEB31'}, {'ip': u'10.10.218.108', 'name': u'SRV-CPMS10-WEB30'}, '...(remaining elements truncated)...']
QuerySet若是跨表查詢呢?
咱們知道對象跨表查詢能夠用點,QuerySet能夠使用雙下劃線「__」,例如獲取Uhost表中全部對象的project id 和project name,能夠這樣作:
>>> host2 = Uhost.objects.all().values('ip','name','project__id','project__name') >>> host2[0] {'ip': u'10.6.13.253', 'project__name': u'CPMS10', 'name': u'dbbackupsyncer2', 'project__id': u'org-81'}
總結:查詢集作跨表查詢時,使用雙下劃線"__"