首页 > 解决方案 > Django 对象过滤器预期 id (int) 但得到 str

问题描述

我制作了 Django 博客项目,并实现了一个按标签过滤帖子的功能。可以选择某个标签并查看带有该特定标签的所有帖子。但是当我想按此标签过滤所有帖子时遇到麻烦。我收到一个错误,Django 需要 int number 但不是 str。如何解决这个问题呢?

这是我的代码

 models.py
 
class Tag(models.Model):
    name = models.CharField(max_length=200, null=True)
    slug = models.SlugField(max_length=250, unique=True, editable=False)
 
 
class ProjectPost(models.Model):
    tag = models.ForeignKey(Tag, on_delete=models.PROTECT)
 
 
 
url.py
 
urlpatterns = [
    ...
    path("projects/", views.projects, name='projects'),
    path('projects/<slug:tag>/',views.projects, name='projects_tag'),
] 
 
 
views.py
 
def projects(request, tag=None):
 
    if tag is not None:
        ProjectPost.objects.filter(tag=tag)
    else:
        posts = ProjectPost.objects.all()
 
    tags = Tag.objects.all()
    context = {'posts':posts, 'tags':tags}
    return render(request, 'website/projects.html', context)

这是错误

ValueError at /projects/romania/
Field 'id' expected a number but got 'romania'.
Request Method: GET
Request URL:    http://127.0.0.1:8000/projects/romania/
Django Version: 3.2.5
Exception Type: ValueError
Exception Value:    
Field 'id' expected a number but got 'romania'.
Exception Location: /home/cristian/Desktop/GreatEcology my project/ecosite/venvecosite/lib/python3.8/site-packages/django/db/models/fields/__init__.py, line 1825, in get_prep_value
Python Executable:  /home/cristian/Desktop/GreatEcology my project/ecosite/venvecosite/bin/python
Python Version: 3.8.5
Python Path:    
['/home/cristian/Desktop/GreatEcology my project/ecosite/ecowebsite',
 '/home/cristian/Anaconda3/lib/python38.zip',
 '/home/cristian/Anaconda3/lib/python3.8',
 '/home/cristian/Anaconda3/lib/python3.8/lib-dynload',
 '/home/cristian/Desktop/GreatEcology my '
 'project/ecosite/venvecosite/lib/python3.8/site-packages']
Server time:    Wed, 21 Jul 2021 14:36:51 +0000

标签: pythondjango

解决方案


我猜你在你的tag变量中得到标签的名字,所以只需用这个名字过滤

def projects(request, tag=None):
    if tag:
        posts = ProjectPost.objects.filter(tag__name=tag)
    else:
        posts = ProjectPost.objects.all()
    ...

推荐阅读