正确获取模型ID

时间:2016-06-01 18:41:47

标签: python django django-models django-views django-urls

我有两个型号。一个用于构建主菜单的模型,另一个用于文章。每篇文章都有ForeignKey将其链接到主菜单项。

我无法理解,如何在页面Article上显示与menuItem模型关联的内容以及如何将menuItem模型的alias字段用于网址?

我的模型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'),
    ]

1 个答案:

答案 0 :(得分:2)

您只需按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 doc。

修改

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

请注意,alias对象应该有MainMenuItem个,否则get()会抛出异常&#34;返回多个对象&#34;。