2014-01-17 142 views
0

全部,django reverse foreignkey is empty

我想不通這是行不通的。

models.py:

from django.db import models 

class MyModel(models.Model): 
    name   = models.CharField(max_length=64,blank=False,null=False) 
    parent_model = models.ForeignKey('self',null=True,blank=True,related_name="child_models") 

    def __unicode__(self): 
     return u'%s' % (self.name) 

    def add_child(self,child): 
     child.parent_model = self 

蟒蛇manage.py殼:

>>> foo = MyModel(name='foo') 
>>> bar = MyModel(name='bar') 
>>> foo.add_child(bar) 
>>> bar.parent_model 
<MyModel: foo> 
>>> foo.child_models.all() 
[] 

爲什麼是反向外鍵 「child_models」 空當外鍵 「parent_model」 已定?

感謝


Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from questionnaire.models import * 
>>> foo = TestModel(name='foo') 
>>> bar = TestModel(name='bar') 
>>> foo.save() 
>>> bar.save() 
>>> foo.add_child(bar) 
>>> bar.get_parent() 
<TestModel: foo> 
>>> foo.get_children() 
[] 

def myView(request): 
    foo = MyModel(name='foo') 
    bar = MyModel(name='bar') 
    foo.add_child(bar) 

    # I don't want to have to save foo or bar before I know that the data is correct, 
    # or that the user has even pressed submit 

    if request.method == "POST": 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     # somewhere in here is where I want to do the saving to the db 
     instance = form.save(commit=False) 
     instance.save() 
     form.save_m2m() 
    else: 
     form = MyForm(instance=foo) 

    return render_to_response('my_template.html', {"form":form}, context_instance=RequestContext(request)) 
+1

您是否在設置父級模型後保存孩子? – Wogan

+0

@Wogan - 是的,我已經嘗試在這些操作之前和之後保存foo和bar。它沒有任何區別。 – trubliphone

+0

然後請在創建模型的地方張貼會話,保存它們,然後添加孩子並再次保存,然後訪問反向關係。 –

回答

1

療法eare兩個可能的原因:

在你add_child方法:

那不是你的問題,但你可以來翻過這也

def add_child(self,child): 
    child.parent_model = self 

你不救child。所以你的改變不會反映到數據庫中。但由於你的querysets也是對象:

>>> foo.add_child(bar) 
>>> bar.parent_model 
<MyModel: foo> 

bar對象保持其新的數據,但因爲你沒有把它保存到數據庫中,這並不反映foo

你正在處理出-of最新數據:

這是你的問題

>>> foo = TestModel(name='foo') 
>>> bar = TestModel(name='bar') 
>>> foo.save() 
>>> bar.save() 

保存它們,並且foobar對象都攜帶與其相關數據庫記錄相同的值。

>>> foo.add_child(bar) 

您更新bar對象,但不保存它。所以每個數據庫數據都不會更新,只有bar對象被更改。您的bar對象已更新。由於您不保存對數據庫的更改並刷新相關對象(再次從數據庫中檢索它們),因此不會更新。因此,您的foo對象仍然過時

您必須保存數據並從數據庫中再次檢索所需的對象...

>>> foo = TestModel(name='foo') 
>>> bar = TestModel(name='bar') 
>>> foo.save() 
>>> bar.save() # Instead of make a second save, you can discard this save step and save after `add_child` 
>>> foo.add_child(bar) 
>>> bar.save() 
>>> foo = MyModel.objects.get(name="foo") 
+0

謝謝你。你的解釋是有道理的,我明白爲什麼這些對象沒有被更新。如果你看看我最近對我的問題的編輯,你可以看到我仍然對代表這些信息感興趣,而不訴諸保存模型。 – trubliphone