代码之家  ›  专栏  ›  技术社区  ›  SangminKim

当django模型访问DB时

  •  1
  • SangminKim  · 技术社区  · 11 年前

    我很好奇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 回复  |  直到 11 年前
        1
  •  2
  •   lifeng.luck    11 年前

    我用一个类似的模型来演示:

    我的型号: IC类(型号.型号):

        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>
    

    我很抱歉我的英语不好。