我正在从tangowithdjango学习django。我想了解populate_rango.py
的代码。
代码是:
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函数没有调用save:
def add_cat(name):
c = Category.objects.get_or_create(name=name)[0]
return c
while,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
请向我解释一下。
答案 0 :(得分:2)
add_cat
函数调用get_or_create
,这意味着如果您的数据库具有名称匹配的相同条目,则只返回实例,否则创建一个。它返回一个元组。第一个元素是实例,第二个元素是一个布尔值,表示结果是否是新实例的创建。
add_page
调用get_or_create
以及save
,但它符合add_page
所需的逻辑。 save
中的add_page
表示:
“我现在有了这个页面,无论它是新页面还是现有页面,但我要更新url
和views
并保存结果”。 add_cat
只需要创建Category
,而不是更新任何内容。每次更新现有实例时,都需要调用save
来保存更改。
查看关于get_or_create的django文档,它解释了您需要了解的所有内容。