2016-03-22 18 views
1

我正在從tangowithdjango學習django。我想了解populate_rango.py的代碼。 代碼是:爲什麼不在一個模型上調用save(),同時調用另一個模型

import os 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tango_with_django_project.settings') 

import django 
django.setup() 

from rango.models import Category, Page 


def populate(): 
    python_cat = add_cat('Python') 

    add_page(cat=python_cat, 
     title="Official Python Tutorial", 
     url="http://docs.python.org/2/tutorial/") 

    add_page(cat=python_cat, 
     title="How to Think like a Computer Scientist", 
     url="http://www.greenteapress.com/thinkpython/") 

    add_page(cat=python_cat, 
     title="Learn Python in 10 Minutes", 
     url="http://www.korokithakis.net/tutorials/python/") 

    django_cat = add_cat("Django") 

    add_page(cat=django_cat, 
     title="Official Django Tutorial", 
     url="https://docs.djangoproject.com/en/1.5/intro/tutorial01/") 

    add_page(cat=django_cat, 
     title="Django Rocks", 
     url="http://www.djangorocks.com/") 

    add_page(cat=django_cat, 
     title="How to Tango with Django", 
     url="http://www.tangowithdjango.com/") 

    frame_cat = add_cat("Other Frameworks") 

    add_page(cat=frame_cat, 
     title="Bottle", 
     url="http://bottlepy.org/docs/dev/") 

    add_page(cat=frame_cat, 
     title="Flask", 
     url="http://flask.pocoo.org") 

    # Print out what we have added to the user. 
    for c in Category.objects.all(): 
     for p in Page.objects.filter(category=c): 
      print "- {0} - {1}".format(str(c), str(p)) 

def add_page(cat, title, url, views=0): 
    p = Page.objects.get_or_create(category=cat, title=title)[0] 
    p.url=url 
    p.views=views 
    p.save() 
    return p 

def add_cat(name): 
    c = Category.objects.get_or_create(name=name)[0] 
    return c 

# Start execution here! 
if __name__ == '__main__': 
    print "Starting Rango population script..." 
    populate() 

什麼我無法理解的是,在add_cat功能不調用保存:

def add_cat(name): 
c = Category.objects.get_or_create(name=name)[0] 
return c 

同時,add_page調用p.save():

def add_page(cat, title, url, views=0): 
    p = Page.objects.get_or_create(category=cat, title=title)[0] 
    p.url = url 
    p.views = views 
    p.save() 
    return p 

請向我解釋這一點。

回答

2

add_cat函數調用get_or_create,這表示如果您的數據庫具有與名稱匹配相同的條目,則只返回實例,否則創建一個。它返回一個元組。第一個元素是實例,第二個元素是一個布爾值,指示結果是否是新實例的創建。

,另一方面add_page,來電get_or_create以及save,但它會與邏輯add_page需求。 saveadd_page表示: 「我現在擁有此頁面,無論它是新頁面還是現有頁面,但是我要更新urlviews並保存結果」。 add_cat只需創建Category,不更新任何內容。每次更新現有實例時,都需要撥打save來保存更改。

檢查django文檔約get_or_create,它解釋了你需要知道的一切。

+0

不add_page也調用get_or_create? – learner

+0

對不起,我不明白你的意思,是啊'add_page'調用'get_or_create',所以你的問題是什麼? –

+0

正如我所說,p.save()被調用,但不是c.save()。 – learner

相關問題