如何在 Django 的产品过滤功能中获取公司名称?

Posted

技术标签:

【中文标题】如何在 Django 的产品过滤功能中获取公司名称?【英文标题】:How to get Company names in Product filter function in Django? 【发布时间】:2019-07-04 03:12:35 【问题描述】:

我想获得一个 JSON 字典,其中包含所有产品名称,包括相应的公司名称(请参阅“我想要的输出”部分)。我的搜索/过滤功能将数字作为公司返回,这是错误的(请参阅“我拥有的输出”部分)。谢谢!

产品型号

class Product(models.Model):
    name = models.CharField(max_length=150)
    company = models.ForeignKey(Company, on_delete=models.CASCADE)

公司模式

class Company(models.Model):
    name = models.CharField(max_length=150)

搜索/过滤功能

product_names = Product.objects.filter(name__startswith=request.GET.get('query')).values('name', 'company')

我有输出

"products": ["name": "bla 2", "company": 3, "name": "bla 1", "company": 10]

我想要的输出

"products": ["name": "bla 2", "company": "apple", "name": "bla 1", "company": "samsung"]

【问题讨论】:

name 中的Company 模型设置为主键,如下所示:name = models.CharField(max_length=150, primary_key=True) 我认为将名称设置为主键并不明智,因为产品/公司可以具有相同的名称。 我想保留默认id为pk。 然后尝试from django.core import serializers 然后print(serializers.serialize("json", [Product.objects.filter(name__startswith=request.GET.get('query'))])) 我找到了我的问题的答案!这很简单:product_names = Product.objects.filter(name__startswith=request.GET.get('query')).values('name', 'company__name')) 【参考方案1】:

这就是解决我的问题的方法:

product_names = Product.objects.filter(name__startswith=request.GET.get('query'))
.values('name', 'company__name'))

【讨论】:

【参考方案2】:

在此处查看序列化程序:https://www.django-rest-framework.org/api-guide/serializers/

序列化器允许您指定从模型中呈现数据的格式,这听起来像是您想要实现的。

【讨论】:

我找到了我的问题的答案!这很容易:product_names = Product.objects.filter(name__startswith=request.GET.get('query')).values('name', 'company__name')) 谢谢!【参考方案3】:

如果你想在字典中显示company 而不是company__name,那么你可以像这样使用F 对象和annotate

from django.db.models import F

product_names = Product.objects.filter(name__startswith=request.GET.get('query'))
.values('name').annotate(company=F('company__name')))

【讨论】:

我发现还有更短的方法 :) .....values('id', 'name', company_name=F('company__name')) @dunkubok 那行不通。即使是这样,您仍然会将id 字段包含在您的问题中未提及的字典中:) @dunkubok .values('id', 'name', company_name=F('company__name')) 显示 company_name 而不是 company

以上是关于如何在 Django 的产品过滤功能中获取公司名称?的主要内容,如果未能解决你的问题,请参考以下文章

从管理产品网格将产品导出到 csv

如何在 django 模板中获取站点名称?

使用 django_filters 创建 OR 过滤器

在Django过滤器中获取小写/无空格名称等于小写/无空格参数的对象

DRF如何通过外键公司过滤用户和产品?

如何在 Django 中使用字段名称、条件和值进行动态过滤