簡體   English   中英

Django ManyToMany關系不持久

[英]Django ManyToMany relationship not persisting

我在工作的Django應用程序中遇到了麻煩,當用戶嘗試創建多對多關系時,該關系不會持久。 不過,我可以通過管理界面創建此類關系。

這是一些我希望可以解釋的代碼。

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'

因此,ManyToMany關系似乎是在編輯階段在foo.py中創建的,但並沒有持久到應該顯示給用戶的位置。 任何人都可以建議這里發生了什么,或者我可能在哪里尋找進一步的線索?

由於通用名稱,很難理解要執行的操作,但是我將嘗試使用一些推薦的約定來重寫您的代碼,並希望它可以清除您遇到的所有錯誤:

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

原來,解決方案是在應用程序的其他地方添加了一些其他代碼,這些代碼在我添加到foo.linked_bar之后就刪除了,最初我沒有發現。 因此,最后一件瑣碎的事情,但最令人討厭。

由於有用的編碼約定建議,我將接受其他答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM