如何从具有相同类别名称的数据库中收集/排序项目?

时间:2015-09-28 06:50:00

标签: python django

我最近一直在创建一个Hackernews类型的克隆,并且在我的数据库布局和视图方面遇到了一些麻烦。

基本上,用户可以发布故事并为每个故事选择一个类别。这是我的模特:

models.py

class Category(models.Model):
    category_name = models.CharField(max_length = 50)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __unicode__(self):
        return self.category_name

    class Meta:
        verbose_name_plural = "categories"


class Story(models.Model):
    title = models.CharField(max_length = 200)
    url = models.URLField()
    points = models.IntegerField(default = 1)
    moderator = models.ForeignKey(User, related_name = 'moderated_stories')
    category = models.ForeignKey(Category, related_name = 'categories')
    voters = models.ManyToManyField(User, related_name = 'liked_stories')
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    @property 
    def domain(self):
        return urlparse(self.url).netloc

    def __unicode__(self):
        return self.title

    class Meta:
        verbose_name_plural = "stories"

首先,我想确认这是应该如何规划的?

这导致了我的第二个问题。我想收集属于特定类别的所有故事并将其显示在各自的网址上(即localhost / engineering将显示工程类别中的所有故事)。

到目前为止,这是我的观点/网址。它所做的就是为数据库中的每个类别分配自己的URL。

url.py

url(r'^(?P<category_id>[0-9]+)/$', 'stories.views.category'),

views.py

def category(request, category_id=1):
    template = 'stories/category.html'
    category = Category.objects.get(id = category_id)
    return render_to_response(template, {
        'category': category
        })

我可以添加哪些类别视图,以便收集所有具有相同类别的故事,以便在我的模板中显示?

道歉,如果事情没有意义,我只是Django的新手。

1 个答案:

答案 0 :(得分:3)

是的,您也可以在模板中使用set {/ 3}}:

在模板中

{{ for cat_story in category.story_set.all }}
    {{cat_story.title }}
    {{cat_story.url }}
    ...
{{ endfor }}

更新:啊,您使用了reated_name,那么您应该使用categories代替story_set。请尝试使用category.categories.all代替category.story_set.all

{{ for cat_story in category.categories.all }}
    {{cat_story.title }}
    {{cat_story.url }}
    ...
{{ endfor }}

更新:是的,django数据库api在两个视图和模板中的使用情况几乎相同。您可以查看相关的reverse relation (related objects)

以上页面显示了以下示例:

class Publication(models.Model):
    title = models.CharField(max_length=30)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

article1.publications.all()
publication2.article_set.all()

您可以在没有括号的模板中使用类似的语法

{{ for publication in  article1.publications.all }}

{{ for article in publication2.article_set.all }}