首页 > 解决方案 > 为 Dango 中的类别过滤文章

问题描述

很好,我正在做一个个人博客,作为 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)

标签: pythonsqldjango

解决方案


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

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

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

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

class Category(models.Model):
    # …

现在我们可以使用以下方法检索Category给定的 s Article

my_article.categories.all()

或者我们可以通过以下方式获得Article至少具有给定类别的所有 s:

Article.objects.filter(categories=my_category)

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

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)

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

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

推荐阅读