【问题标题】:filter articles for category in Dango为 Dango 中的类别过滤文章
【发布时间】:2021-07-03 11:04:01
【问题描述】:

很好,我正在做一个个人博客,作为 Web 开发领域的第一个项目,我正在使用 django 进行开发,但是我有一个问题,事实上我找不到按类别过滤文章的方法,我给你看我看过的模特。

我见过一些使用外键的例子,但这导致我的文章只能有一个类别。我知道要按类别获取文章,我必须对类别进行“过滤”,但我什至到了那里,如果有人可以指导我,我将不胜感激

class Article(models.Model):
title = models.CharField(max_length=150, verbose_name='Titulo')
subtitle = models.CharField(max_length=50,default='Máximo 50 carácteres, que no se te olvide' ,verbose_name='subtitulo')
content = RichTextField(verbose_name="Contenido")
image = models.ImageField(default="null", verbose_name="Imagen", upload_to = "media")
user = models.ForeignKey(User, verbose_name="Usuario", on_delete=models.CASCADE, editable=False)
categories = models.ManyToManyField(Category, verbose_name="Categorias")
create_at = models.DateTimeField(auto_now_add=True, verbose_name="Creado el")
update_at = models.DateTimeField(auto_now=True, verbose_name="Editado el")

def __str__(self):
    return self.title

class Meta:
    verbose_name = ('Articulo')
    verbose_name_plural = ('Articulos')
    ordering = ['id']


class Category(models.Model):
name = models.CharField(max_length=100, verbose_name="Nombre")
description = models.CharField(max_length=255, verbose_name="Descripcion")
create_at = models.DateTimeField(auto_now_add=True, verbose_name="Creado el")

def __str__(self):
    return self.name

class Meta:
    verbose_name = ('Categoria')
    verbose_name_plural = ('Categorias')

/视图:

def article(request, article_id):
    article = get_object_or_404(Article, id=article_id)
    articles = Article.objects.all()
    categorys = Category.objects.all()
    comments = Comentary.objects.filter(post = article_id)

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    我见过一些使用外键的例子,但这导致我的文章只能有一个类别。

    确实,通过使用ManyToManyField [Django-doc],您可以将一篇文章链接到多个类别,并且一个类别可以包含多个篇文章。

    由于您首先定义了Article,因此您不能在文件后面引用Category,因为此时Category 尚未定义。您可以使用字符串文字来执行此操作:

    class Article(models.Model):
        # …
        categories = models.ManyToManyField('Category', verbose_name='Categorias')
        # …
    
    class Category(models.Model):
        # …

    现在我们可以检索给定Article 的Categorys:

    <i>my_article</i>.<strong>categories</strong>.all()

    或者我们可以获得至少具有给定类别的所有Articles:

    Article.objects.filter(<strong>categories=<em>my_category</em></strong>)

    如果您想为给定文章呈现类别,您可以使用:

    def article(request, article_id):
        article = get_object_or_404(Article, id=article_id)
        articles = Article.objects.all()
        categorys = article.categories.all()
        comments = Comentary.objects.filter(post = article_id)

    您还可以通过以下方式查看Category 及其相关Articles:

    def category(request, category_id):
        category = get_object_or_404(Category, pk=category_id)
        articles = category.article_set.all()
        # …

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 2017-08-06
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2020-12-29
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多