django如何为ForeignKey使用过滤器

问题描述

我无法按类别进行过滤。

category = ['fruits','vegetable']
post = ['apple','banana','onion']

python 3 / django 3

project / app / models.py

from django.db import models

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=100)

class Post(models.Model):
    title = models.CharField(max_length=100)
    category =  models.ForeignKey(Category,on_delete=models.PROTECT)

类别

category1 name=fruits
category2 name=vegetable

发布

post1 title=apple category=fruits
post2 title=banana category=fruits
post3 title=onion category=vegetable

python manage.py shell

>>> from post.models import *
>>> category = Category.objects.all()
>>> print(category)
<QuerySet [<Category: vegetable>,<Category: fruits>]>
>>> post = Post.objects.all()
>>> print(post)
<QuerySet [<Post: apple>,<Post: banana>,<Post: onion>]>

views.py工作!!!

def category(request,pk):
    category = Category.objects.all()
    post = Post.objects.filter(category__name='vegetable')
    category_key = Category.objects.get(name=pk)
    return render(request,'post/list.html',{'post':post,'category':category})

views.py不起作用:(

def category(request,category_name,pk):
    category = Category.objects.all()
    post = Post.objects.filter(category__name=category_name)
    category_key = Category.objects.get(name=pk)
    return render(request,'category':category})

解决方法

您可以过滤Category对象:

posts = Post.objects.filter(category=category_object)

或者如果您没有Category对象,请使用双下划线__来过滤类别名称:

posts = Post.objects.filter(category__name=category_name)

因此,您可以使用以下方法获取与Post相关的fruits对象:

posts = Post.objects.filter(category__name='fruits')
,

posts = Post.objects.filter(category = Category.objects.get('name'= Whatever_you_are_searching_for ))