正确获取模型ID

Get model ID correctly

我有两个模型。一种用于构建主菜单的模型,另一种用于文章的模型。每篇文章都有 ForeignKey 到 link 到主菜单项。

我想不通,如何在页面 Article 上显示 linked 到 menuItem 模型以及如何使用 menuItem 模型的 [= URL 地址的 18=] 字段?

我的模型menuItem:

    # -*- coding: utf-8 -*-
    from django.db import models

    class MainMenuItem(models.Model):
        class Meta:
            db_table = "menu_item"  
        title = models.CharField(max_length = 50)
        alias = models.CharField(max_length = 50)

        def __unicode__(self):
            return self.title

        def __str__(self):
            return self.title

我的模型Article:

    class Article(models.Model):
        class Meta:
            db_table = "article"

        menu = models.ForeignKey(MainMenuItem, blank = True, null = True)
        active = models.BooleanField(default = True)
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now=True)

        def __unicode__(self):
            return unicode(self.menu) or u''

        def __str__(self):
            return self.menu

我的views.py

    def menu_builder(request, alias):
        findId = MainMenuItem.objects.????
        elements = {
            'menuItems': MainMenuItem.objects.all(),
            'article': Article.objects.get(id=??????),
        }
        return render_to_response('myview.html', elements)

我的urls.py:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^(?P<alias>.+?)/$', 'menuItem.views.menu_builder'),
    ]

您只需按 MainMenuItem 上的别名进行过滤,然后获取与该别名相关的所有文章 MainMenuItem:

def menu_builder(request, alias):
    main_menu_item = MainMenuItem.objects.get(alias=alias)
    elements = {
            'menuItems': main_menu_item,
            'articles': main_menu_item.article_set.all(),
        }
    return render_to_response('myview.html, elements)

关于 related object lookup using _set 的 Django 文档。

编辑:

我之前应该使用 objects.get(),但我使用的是 objects.filter(),这是错误的。不同之处在于您应该只获取一个项目,以便您可以获得与该对象相关的文章。如果您使用 filter,您最终会得到一个查询集,但是检查多个对象上的相关对象没有意义,因此会出现错误 'QuerySet' object has no attribute 'article_set'

请注意,MainMenuItem 对象应该有不同的 alias,否则 get() 会抛出异常 "Multiple objects returned"。