【问题标题】:How to get Company names in Product filter function in Django?如何在 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'))

标签: python django filter model


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多