首页 > 解决方案 > Django过滤ForeignKey

问题描述

这是视图:

def post(self, request):
    author_request = request.data.get("author")
    queryset = Book.objects.filter(author=author_request)
    serializer = BookSerializer(queryset, None)
    return Response(serializer.data, HTTP_200_OK)

这是模型:

class Author(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
full_name = models.CharField(max_length=255, null=True, blank=True)
about = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __str__(self):
    return self.full_name

class Meta:
    verbose_name = 'Author'
    verbose_name_plural = 'Authors'

所以,当我尝试按作者过滤这本书时,我得到了错误。该错误告诉我,我输入的 POST 数据是“Aleksa Petrovic”,数据库中存在的作者姓名不是 UUID。所以当我过滤它时,它会按 UUID 过滤,我希望它按“full_name”过滤

标签: pythondjangodjango-rest-framework

解决方案


您可以.filter(…)[Django-doc]使用:

Book.objects.filter(author__full_name=name_of_author)

可以使用双下划线 ( __) 来“透视”关系。

因此,视图如下所示:

def post(self, request):
    author_request = request.data.get('author')
    queryset = Book.objects.filter(author__full_name=author_request)
    serializer = BookSerializer(queryset, None)
    return Response(serializer.data, HTTP_200_OK)

通常使用过滤器的搜索不是由 POST 请求处理,而是由 GET 请求处理,因为 GET 请求应该从 Web 服务器检索数据。


推荐阅读