2017-02-08 3 views
0

私は比較的新しいDjangoです。データをフィルタリングするときに問題が発生しています。があるDjangoは2つのフィールドにフィルタを組み合わせます

Account(models.Model): 
    name = models.CharField(max_length=60) 
    hotel = models.ForeignKey(Hotel) 
    account_type = models.CharField(choices=ACCOUNT_TYPE, max_length=30) 

Transaction(models.Model):   
    account = models.ForeignKey(Account, related_name='transaction') 
    transaction_type = models.CharField(choices=TRANSACTION_TYPE, max_length=15) 
    description = models.CharField(max_length=100, blank=True, null=True) 
    date_created = models.DateTimeField(default=timezone.now) 

ACCOUT_TYPE:私は、下記の二つのモデルを、持っている

私は、アカウントの種類が指定された日付範囲内IncomeExpenseあるすべてのトランザクションをフィルタリングする
ACCOUNT_TYPE = (
    (0, 'Asset'), 
    (1, 'Liabilities'), 
    (2, 'Equity'), 
    (3, 'Income'), 
    (4, 'Expense') 
) 

。 Djangoでこれらのフィルタをどのように組み合わせることができますか?

私はこのように試してみました:

income_account = Account.objects.filter(account_type=3) 
expense_account = Account.objects.filter(account_type=4) 
transactions = Transaction.objects.filter(Q(
    account=income_account, 
    date_created__gte=request.data['start_date'], 
    date_created__lte=request.data['end_date'] 
) & Q(
    account=expense_account, 
date_created__gte=request.data['start_date'], 
date_created__lte=request.data['end_date'])).order_by('date_created') 

しかし、それは働いていません。これは、次のエラーが発生します。

ProgrammingError: more than one row returned by a subquery used as an expression 

答えて

0

income_accountexpense_accountは、オブジェクトのリストで、単一のオブジェクトではありません。したがって、このaccount=income_accountとこのaccount=expense_accountの代わりに、inaccount__in=income_accountaccount__in=expense_accountを使用してみてください。 また、あなたはおそらく、このようなクエリセットを簡素化することができます:

accounts = Account.objects.filter(Q(account_type=3) | Q(account_type=4)) 
transactions = Transaction.objects.filter(
    account__in=accounts, 
    date_created__gte=request.data['start_date'], 
    date_created__lte=request.data['end_date'] 
).order_by('date_created') 
1

代わりに、複数のクエリセットを持つのQは、フィルタのOR INGを可能にするとして、あなたは、一つだけを持つことができます。あなたは何ができる:

Transaction.objects.filter(
    (Q(account__account_type=3) | Q(account__account_type=4)) & 
    Q(date_created__range=[start_date, end_date]) 
) 

__rangeは、指定start_dateend_date間の日付を取得するために使用することができます。

1

inを使用して、複数の値でレコードを検索することができます。だから、あなたがTransactionを望むなら、ACCOUNT_TYPEIncome, Expenseです。このように使うことができます。

Transaction.objects.filter(Q(account__in=[3,4]) & Q(date_created__gte=request.data['start_date']) & Q(date_created__lte=request.data['end_date'])).order_by('date_created') 
0

これはあなたのために動作します: -

result = Account.objects.filter((account_type__in['Income','Expense']) 
        OR 
result = Account.objects.filter((account_type__in['0','4']) 

あなたはCharFieldですとして言及さACCOUNT_TYPEを持っているので、私は文字列として0と4を入れています。

関連する問題