2016-01-06 101 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,而我最初没有发现该代码。所以,最后一件微不足道的事情,但最讨厌。

由于有用的编码惯例建议,我会接受其他答案。