Django-Manytomy关系不持久

2024-10-01 05:02:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个Django应用程序中遇到了一个麻烦,当用户试图创建一个多对多关系时,这种关系就不会持续。不过,我可以通过管理界面创建这样的关系。你知道吗

下面是一些代码,我希望可以解释一下。你知道吗

你知道吗型号.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公司在编辑阶段,但不会持续到应该显示给用户的位置。有人能告诉我这里可能发生了什么,或者我可以在哪里寻找进一步的线索吗?你知道吗


Tags: pyidgetlenifobjectsfoo关系
2条回答

解决方案是在应用程序的其他地方有一些代码被删除了美食酒吧在我加进去之后,我一开始没有发现。所以,一件小事到头来,却最烦人。你知道吗

我将接受另一个答案,因为有用的编码约定建议。你知道吗

由于泛型名称的原因,要理解尝试执行的操作有点困难,但我将尝试使用一些推荐的约定重写代码,希望能够清除您遇到的任何错误:

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

相关问题 更多 >