最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關于Django外鍵賦值問題詳解

 更新時間:2017年08月13日 15:56:57   作者:Youmai  
這段時間用django 做程序用到了一對多的關系的操作,下面分享一些心得體會,這篇文章主要給大家介紹了關于Django外鍵賦值問題的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

本文主要給大家介紹關于Django外鍵賦值的相關內(nèi)容,分享出來供大家參考學習,在開始之前,我們先來看一段代碼:

class Article(models.Model):
 title = models.CharField(max_length=1024, default='')
 ...
 def __str__(self):
  return 'Article pk:%d %s' % (self.pk, self.title[:30])

class ArticleContent(models.Model):
 article = cached_fields.OneToOneField(Article)
 ...

寫代碼的的時候,發(fā)現(xiàn)了一個很奇怪的現(xiàn)象,當我給一個instance的外鍵(以_id結尾)賦值(數(shù)字)的時候 ,這個外鍵對應的instance的值并不會改變。

In [44]: ac = ArticleContent.objects.get(article_id=14269)
In [45]: ac.article_id
Out[45]: 14269
In [46]: ac.article_id = 14266
In [47]: ac.save()
In [48]: ac.article
Out[48]: <Article: Article pk:14266 EC: Russia, Ukraine to Meet in>
In [49]: ac.article.pk
Out[49]: 14266

如上面的代碼所示,為了找到答案,我翻了一下Django的源碼:

django/db/models/fields/related_descriptors.py 
  def __get__(self, instance, cls=None):
   """
   Get the related instance through the forward relation.

   With the example above, when getting ``child.parent``:

   - ``self`` is the descriptor managing the ``parent`` attribute
   - ``instance`` is the ``child`` instance
   - ``cls`` is the ``Child`` class (we don't need it)
   """
   if instance is None:
    return self

   # The related instance is loaded from the database and then cached in
   # the attribute defined in self.cache_name. It can also be pre-cached
   # by the reverse accessor (ReverseOneToOneDescriptor).
   try:
    rel_obj = getattr(instance, self.cache_name)
   except AttributeError:
    val = self.field.get_local_related_value(instance)
    if None in val:
     rel_obj = None
    else:
     qs = self.get_queryset(instance=instance)
     qs = qs.filter(self.field.get_reverse_related_filter(instance))
     # Assuming the database enforces foreign keys, this won't fail.
     rel_obj = qs.get()
     # If this is a one-to-one relation, set the reverse accessor
     # cache on the related object to the current instance to avoid
     # an extra SQL query if it's accessed later on.
     if not self.field.remote_field.multiple:
      setattr(rel_obj, self.field.remote_field.get_cache_name(), instance)
    setattr(instance, self.cache_name, rel_obj)

   if rel_obj is None and not self.field.null:
    raise self.RelatedObjectDoesNotExist(
     "%s has no %s." % (self.field.model.__name__, self.field.name)
    )
   else:
    return rel_obj

注釋得非常到位,當我們請求ac.article的時候,會先去檢查對應的cache(在這里是_article_cache,感興趣可以去看cache_name的生成規(guī)則,就是外鍵名前面加下劃線,后面加cache)存不存在,如果不存在那么就進行數(shù)據(jù)庫請求,請求完之后會保存到cache中。

我們再看看__set__ ,代碼太長就不貼了(就在__get__方法下面)。除了給外鍵字段(article)賦值外,還會將pk字段(article_id,是lh_field.attname的值)設置為None,這樣下次請求的時候就能拿到正確的值。

以上都是ForeignKey的Magic,而當我們給article_id賦值的時候,只是在給一個普通的attribute賦值而已,沒有任何magic,不會清理對應外鍵的cache,這時候拿到的instance仍然是cache中原來的那個instance。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Python如何實現(xiàn)macOS系統(tǒng)代理的設置

    Python如何實現(xiàn)macOS系統(tǒng)代理的設置

    這篇文章主要為大家詳細介紹了Python如何實現(xiàn)macOS系統(tǒng)代理的設置,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-01-01
  • Python中字符串與編碼示例代碼

    Python中字符串與編碼示例代碼

    這篇文章主要介紹了Python中字符串與編碼示例代碼,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Python裝飾器詳細介紹

    Python裝飾器詳細介紹

    這篇文章主要介紹了Python @property裝飾器的用法,在Python中,可以通過@property裝飾器將一個方法轉(zhuǎn)換為屬性,從而實現(xiàn)用于計算的屬性,下面文章圍繞主題展開更多相關詳情,感興趣的小伙伴可以參考一下
    2022-12-12
  • Python異常信息的不同展現(xiàn)方法總結

    Python異常信息的不同展現(xiàn)方法總結

    在日常開發(fā)的過程中,當代碼報錯時,我們通常要不斷打印、閱讀traceback提示信息,來調(diào)試代碼,這篇文章介紹了如何實現(xiàn)一個Exception?Hooks,使得traceback模塊的提示信息更加精確;同時還介紹了一些第三方庫,這些庫也提供了Exception?Hooks的功能
    2022-11-11
  • Python中xmltodict庫的使用方法詳解

    Python中xmltodict庫的使用方法詳解

    在Python編程中,處理XML數(shù)據(jù)是一項常見且重要的任務,XML(可擴展標記語言)是一種用于存儲和傳輸數(shù)據(jù)的標記語言,Python的標準庫并不直接提供處理XML的便捷方法,因此我們需要借助第三方庫來實現(xiàn)這一功能,本文將詳細介紹xmltodict庫的使用,需要的朋友可以參考下
    2024-11-11
  • Python用5行代碼實現(xiàn)批量摳圖的示例代碼

    Python用5行代碼實現(xiàn)批量摳圖的示例代碼

    這篇文章主要介紹了Python用5行代碼實現(xiàn)批量摳圖的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 徹底解決pip下載pytorch慢的問題方法

    徹底解決pip下載pytorch慢的問題方法

    這篇文章主要介紹了徹底解決pip下載pytorch慢的問題方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • python調(diào)用bash?shell腳本方法

    python調(diào)用bash?shell腳本方法

    這篇文章主要給大家分享了額python調(diào)用bash?shell腳本方法,os.system(command)、os.popen(command)等方法,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2021-12-12
  • Python從wsgi導入失敗的問題解決方法

    Python從wsgi導入失敗的問題解決方法

    本文主要介紹了Python從wsgi導入失敗的問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • Python實現(xiàn)Word表格轉(zhuǎn)成Excel表格的示例代碼

    Python實現(xiàn)Word表格轉(zhuǎn)成Excel表格的示例代碼

    這篇文章主要介紹了Python實現(xiàn)Word表格轉(zhuǎn)成Excel表格的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04

最新評論

兰溪市| 敦化市| 柏乡县| 镇坪县| 玉山县| 玉林市| 华亭县| 房产| 怀宁县| 黄石市| 曲水县| 靖西县| 峡江县| 昔阳县| 任丘市| 桑日县| 巴中市| 金堂县| 永泰县| 曲麻莱县| 富顺县| 庐江县| 道真| 广元市| 河曲县| 疏附县| 彭泽县| 志丹县| 莱芜市| 池州市| 和平县| 杂多县| 鄂伦春自治旗| 丘北县| 南阳市| 荃湾区| 永福县| 卓尼县| 兴城市| 武义县| 高州市|