2016-03-22 7 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データベースに名前が一致するエントリがある場合はインスタンスを返し、そうでない場合はインスタンスを作成します。タプルを返します。最初の要素はインスタンスであり、2番目の要素は結果が新しいインスタンスの作成であるかどうかを示すブール値です。一方、

add_pageget_or_createなどsaveを呼び出しますが、それはニーズをadd_pageロジックとなります。 saveadd_pageの意味は: 「新しいページか既存のページかどうかに関係なく、このページがありますが、とviewsを更新して結果を保存します。 add_catは、Categoryを作成するだけで、何も更新されません。既存のインスタンスを更新するたびに、saveに電話して変更を保存する必要があります。

django docについては、get_or_createを確認してください。知りたいことがすべて説明されています。

+0

add_pageはget_or_createも呼び出しませんか? – learner

+0

申し訳ありませんが、あなたが意味することを理解できません。確かに 'add_page'は' get_or_create'を呼び出します。あなたの質問は何ですか? –

+0

私が述べたように、p.save()は呼び出されますが、c.save()は呼び出されません。 – learner

関連する問題