django: filter.values(...) 不检索请求的字段

Posted

技术标签:

【中文标题】django: filter.values(...) 不检索请求的字段【英文标题】:django: filter.values(...) not retrieving the fields requested 【发布时间】:2020-11-12 16:23:02 【问题描述】:

基于以下模型,我正在尝试通过执行以下过滤器查询 BankingDetail 并检索帐户和机会的信息:

查询:

bankingLST = BankingDetail.objects.filter(opportunity__opportunity_name__icontains = searchItem) | BankingDetail.objects.filter(account__account_name__icontains = searchItem) | BankingDetail.objects.filter(sfAttachmentID__icontains = searchItem) | BankingDetail.objects.filter(opportunity__external_opportunity_id__icontains = searchItem) | BankingDetail.objects.filter(account__external_account_id__icontains = searchItem).values(
    'id',
    'opportunity__external_opportunity_id',
    'account__external_account_id',
    'opportunity__opportunity_name',
    'account__account_name', 
    'account__industry')

型号:

class AccountDetail(models.Model):
    external_account_id = models.CharField(max_length=18, unique = True)
    account_name = models.TextField(unique = False, blank=True, null=True)
    industry = models.CharField(max_length=18, unique = False, blank=True, null=True)
    billing_state = models.CharField(max_length=18, unique = False, blank=True, null=True)
    def __str__(self):
        return self.account_name

class OpportunityDetail(models.Model):
    account = models.ForeignKey(AccountDetail, on_delete=models.CASCADE, related_name='AccountDetails')
    external_opportunity_id = models.CharField(max_length=18, unique = True)
    opportunity_name = models.TextField(unique = False, blank=True, null=True)
    stage_name = models.CharField(max_length=18, unique = False, blank=True, null=True)
    def __str__(self):
        return self.opportunity_name

class BankingDetail(models.Model):
    account = models.ForeignKey(AccountDetail, on_delete=models.CASCADE, related_name='AccountBankingDetails')
    opportunity = models.ForeignKey(OpportunityDetail, on_delete=models.CASCADE, related_name='OpportunityDetails')
    sfAttachmentID = models.CharField(max_length=18, unique = True)
    created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.account.account_name + ' - (' + self.opportunity.opportunity_name + ')'

目前的回应:

        tmpJson = serializers.serialize("json",bankingLST)
        tmpObj = json.loads(tmpJson)
        print(tmpObj)

[

    "model": "app_banking.bankingdetail",
    "pk": 2,
    "fields": 
    "account": 3,
    "opportunity": 2,
    "sfAttachmentID": "175688177w3",
    "created": "2020-07-20T01:55:20.351Z"
    
,

    "model": "app_banking.bankingdetail",
    "pk": 3,
    "fields": 
    "account": 4,
    "opportunity": 3,
    "sfAttachmentID": "1236547898745632x3",
    "created": "2020-07-23T00:08:56.863Z"
    

]

我不明白为什么我指定的字段没有被恢复:

机会__external_opportunity_id account__external_account_id 机会__opportunity_name account__account_name account__行业

还有为什么它在未指定时带回了以下内容:

帐户 机会 sfAttachmentID 已创建

【问题讨论】:

这些数据是如何生成的?它目前正在返回模型上的所有字段 @IainShelvington,问题中的当前响应是执行以下操作的结果: tmpJson = serializers.serialize("json",bankingLST) tmpObj = json.loads(tmpJson) 将您的序列化程序和您用来调用它的代码添加到问题中 @IainShelvington 对不起,我不明白你的要求,你知道我用什么代码来生成那个 JSON 吗?如果这是正确的,我在之前的评论中添加了,但以防万一我也在当前回复下方的问题中添加: 您使用的是django.core.serializers?如果你想要一些复杂的序列化,我建议使用类似djangorestframework 的东西,也许只是内置的json 包可以为你做 【参考方案1】:

你可以试试这个。


from django.db.models import Q 
bankingLST=BankingDetail.objects.filter(Q(opportunity__opportunity_name__icontains=searchItem)|
Q(account__account_name__icontains = searchItem)|
Q(sfAttachmentID__icontains = searchItem)|
Q(opportunity__external_opportunity_id__icontains = searchItem)
|Q(account__external_account_id__icontains = searchItem)).values(
    'id', 'opportunity__external_opportunity_id',
    'account__external_account_id',
    'opportunity__opportunity_name',
    'account__account_name', 
    'account__industry')

【讨论】:

我得到了错误:'dict'对象没有属性'_meta'

以上是关于django: filter.values(...) 不检索请求的字段的主要内容,如果未能解决你的问题,请参考以下文章

注释总和的 Django 聚合平均值(1.6.5)

使用 Django 的 Case/When 查询集条件来设置多个值?

Python数据库查询之组合条件查询-F&Q查询

Django - 学习目录

Django初识

Django之路