为什么不在一个模型上调用save(),同时调用另一个模型

时间:2016-03-22 19:10:04

标签: python django

我正在从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

请向我解释一下。

1 个答案:

答案 0 :(得分:2)

add_cat函数调用get_or_create,这意味着如果您的数据库具有名称匹配的相同条目,则只返回实例,否则创建一个。它返回一个元组。第一个元素是实例,第二个元素是一个布尔值,表示结果是否是新实例的创建。

另一方面,

add_page调用get_or_create以及save,但它符合add_page所需的逻辑。 save中的add_page表示: “我现在有了这个页面,无论它是新页面还是现有页面,但我要更新urlviews并保存结果”。 add_cat只需要创建Category,而不是更新任何内容。每次更新现有实例时,都需要调用save来保存更改。

查看关于get_or_create的django文档,它解释了您需要了解的所有内容。