2016-01-06 103 views
1

我在Django應用程序中遇到了一個令人討厭的問題,當我嘗試創建多對多關係時,該關係不會持續存在。不過,我可以通過管理界面創建這種關係。Django ManyToMany的關係不存在

這裏有一些代碼,我希望可以解釋它。

models.py:

class Foo(models.Model): 
    ... 
    linked_bar = models.ManyToManyField(Bar, blank=True) 
    ... 

的意見/ foo.py:

def editFoo(request,foo_id): 
    fooQuery = Foo.objects.filter(id=foo_id) 
    if len(fooQuery) > 0: 
     foo = fooQuery.get(id=foo_id) 
    else: 
     # handle error &c. 
    ... 
    print str(len(foo.linked_bar.all())) # prints '0' 
    linked_bar_id = request.POST.get('linked-bar-id', '') 
    barQuery = Bar.objects.filter(id=linked_bar_id) 
    if len(barQuery) > 0: 
     bar = barQuery.get(id=bar_id) 
     foo.linked_bar.add(bar) 
     print str(len(foo.linked_bar.all())) # prints '1' 
    return redirect("/foo/" + foo_id) # calls showFoo() 

def showFoo(request,foo_id): 
    fooQuery = Foo.objects.filter(id=foo_id) 
    if len(fooQuery) > 0: 
     foo = fooQuery.get(id=foo_id) 
    ... 
    print str(len(foo.linked_bar.all())) # prints '0' 

因此,多對多的關係似乎正在在編輯階段foo.py創建,但沒有按」堅持它應該顯示給用戶的地方。任何人都可以提出可能在這裏發生的事情,或者我可能在哪裏尋找更多的線索?

回答

1

由於通用名稱有點難以理解正在嘗試完成什麼,但我會嘗試使用一些推薦的約定來重寫您的代碼,並且希望能夠清除您遇到的任何錯誤:

def editFoo(request, foo_id): 

    try: 
     foo_obj = Foo.objects.get(id=foo_id) 
    except Foo.DoesNotExist: 
     ... # Handle error here 

    ... # More code here? 

    print foo_obj.linked_bar.count() # Prints current linked_bar count 

    linked_bar_id = request.POST.get('linked-bar-id', '') 

    try: 
     bar_obj = Bar.objects.get(id=linked_bar_id) 
    except Bar.DoesNotExist: 
     ... # Handle error here 

    if bar_obj: 
     foo_obj.linked_bar.add(bar_obj) 
     print foo_obj.linked_bar.count() # Prints current linked_bar count 
    return redirect("/foo/" + foo_id) # Calls showFoo() 


def showFoo(request, foo_id): 
    foo_obj = Foo.objects.get(id=foo_id) 

    ... # More code here? 
    print foo_obj.linked_bar.count() # Prints current linked_bar count 
    return render(request, 'TEMPLATE.html', {'foo': foo_obj}) # Replace 'TEMPLATE.html' with your template name 
+0

謝謝。看到不同的約定很有趣。我繼承了來自Rails背景的這個項目,並且我對Python不太熟悉。不幸的是,這不是約定的問題。其他事情似乎正在發生。 – knirirr

+0

我還清除了重組之前的一些錯誤,現在對你有用嗎?如果沒有,然後粘貼您收到的錯誤,我會盡我所能提供幫助。 – Hybrid

+0

我沒有收到任何錯誤。代碼似乎運行沒有問題,但添加到linked_bar後,然後linked_bar.count()在showFoo中顯示0,即關聯不會持續。改變約定並沒有什麼區別,我想知道Django的膽量在哪裏,我可能會試圖去調試它。 – knirirr

1

解決方案原來是應用程序中的其他代碼在添加到foo.linked_bar後刪除了foo.linked_bar,而我最初沒有發現該代碼。所以,最後一件微不足道的事情,但最討厭。

由於有用的編碼慣例建議,我會接受其他答案。