当django模型访问DB时

时间:2014-08-01 02:55:42

标签: python django

我很好奇django模型是如何运作的。

表示模型访问DB时。

例如我们有这个模型Person,而DB在first_name =“abc”

上有记录
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

并且为了访问数据

per = Person.object.get(first_name="abc")   #does it have access to DB?   
first_name =  per.first_name                #otherwise it has access to DB?
first_name2 = per.first_name                #first_name is cached? or it has to access DB again?

1 个答案:

答案 0 :(得分:2)

我使用类似的模型来演示它:

我的模特:     class IC(models.Model):

    partno = models.CharField(max_length=200, unique=False)  # 型号名
    sups = models.CharField(max_length=500, blank=True, default=None)
    mfr = models.ForeignKey(Mfr)

你可以这样做,它会打印Django发送的所有SQL查询。

>>> import logging
>>> logger = logging.getLogger('django.db.backends')
>>> logger.setLevel(logging.DEBUG)
>>> logger.addHandler(logging.StreamHandler())

>>> ic = IC.objects.get(id='21')
(0.001) SELECT `icbase_ic`.`id`, `icbase_ic`.`partno`, `icbase_ic`.`mfr_id`, 
     `icbase_ic`.`sups` FROM `icbase_ic` WHERE `icbase_ic`.`id` = 21 ; args=(21,)
>>> ic.partno
u'880'
>>> ic.sups

对于您的模型,显然只有Person.objects.get(first_name="abc")具有数据库访问权限。

但如果该字段为ForeignKey ManyToManyField或其他关系字段,则它将具有数据库访问权限。

>>> ic.mfr
(0.030) SELECT `icbase_mfr`.`id`, `icbase_mfr`.`name`, `icbase_mfr`.`cn_name`, `icbase_mfr`.`url`, `icbase_mfr`.`description`, `icbase_mfr`.`productcount`, `icbase_mfr`.`parent_id`, `icbase_mfr`.`logo_path`, `icbase_mfr`.`active` FROM `icbase_mfr` WHERE `icbase_mfr`.`id` = 99 ; args=(99,)
<Mfr: Keystone Electronics>

对不起我的英语很差。