如何在 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 的产品过滤功能中获取公司名称?的主要内容,如果未能解决你的问题,请参考以下文章