python - 为 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)
解决方案
我见过一些使用外键的例子,但这导致我的文章只能有一个类别。
事实上,通过使用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
及其相关Article
s:
def category(request, category_id):
category = get_object_or_404(Category, pk=category_id)
articles = category.article_set.all()
# …
推荐阅读
- django - Dockerfile ADD . is adding wrong directory
- java - ThreadPoolTaskScheduler 如何异步每个未来
- azure - 使用带有托管标识的 Azure Functions 的事件中心绑定?
- wpf - 使用 RelayCommand 重置 ToggleButton?
- python - 查询路径时如何在 Neo4j 中更快?
- android - 如何在 Firebase android 中添加多组数据而不覆盖它们
- webforms - 在新标签页中打开所有浏览器不工作的链接
- docker - Git 2.8 无法更新子模块
- ios - 为什么我在 Storyboard (Xcode) 中所做的更改没有反映在我的应用程序上?
- c# - TechTalk.Specflow.dll 中的 ConfigurationErrorsException