繁体   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