2016-03-22 16 views
1

numaralı telefonu arayarak bir modele kaydetme(), tangowithdjango'dan django öğreniyorum. populate_rango.py kodunu anlamaya çalışıyorum. Kod geçerli:Neden başka bir

Ben yapamaz kurtarmak, add_cat işlevi çağırmaz olduğunu anlamak duyuyorum Ne
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() 

:

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

ederken, add_page çağıran 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 

Lütfen bunu bana açıklayınız.

cevap

2

add_cat işlevi veritabanı adı maçı ile aynı giriş varsa, o zaman sadece aksi bir tane oluşturun örneğini döndürür demek get_or_create, çağırır. Bir tuple döndürür. İlk öğe örnek, ikinci elemanın sonucun yeni bir örnek oluşturup oluşturmayacağını gösteren bir booledir. Öte yandan

add_page

, get_or_create yanı sıra save çağırır, ama mantık bu add_page ihtiyaçları ile gider. add_page'daki save, anlamına gelir: "Yeni bir sayfa veya var olan bir sayfadan bağımsız olarak, şimdi bu sayfaya sahibim, ancak url ve views 'u güncelleyeceğim ve sonucu kaydedeceğim". add_cat sadece Category oluşturmak zorundadır, hiçbir şey güncellenmez. Mevcut bir örneği her güncellediğinizde, değişiklikleri kaydetmek için save'u aramanız gerekir.

get_or_create ile ilgili django dokümanı kontrol edin, bilmeniz gereken her şeyi açıklar.

+0

Ayrıca add_page de get_or_create 'i çağırmıyor mu? – learner

+0

Maalesef ne demek istediğini anlamıyorum, yea 'add_page'' get_or_create' diyor, bu yüzden sorunuz nedir? –

+0

Belirtildiği gibi, p.save() çağrılır, ancak c.save() değil. – learner

İlgili konular