Manza
Manza

Reputation: 2141

django: filter.values(...) not retrieving the fields requested

Based on the following models, I am trying to query BankingDetail and retrieving information of the account and opportunity, by doing the following filter:

Query:

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')

Models:

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 + ')'

Current response:

        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"
    }
}
]

I dont understand why the fields that I am specifying are not been brought back:

but also why it brought back the below ones when they were not specify:

Upvotes: 0

Views: 48

Answers (1)

Arjun Shahi
Arjun Shahi

Reputation: 7330

You can try this.


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')

Upvotes: 1

Related Questions