英文:
How to filter two different columns values together in filter query Django?
问题
我有两列,
对于单个数值 amount 和范围数值 amount_min 和 amount_max
| amount | amount_min | amount_max | 
|---|---|---|
| 25000 | 0 | 0 | 
| 0 | 100000 | 300000 | 
使用以下查询,
Jobs.objects.filter(Q(created_on__gte = datetime.datetime.now() - datetime.timedelta(days=30)),Q(amount__range=(100000, 300000)) | Q(amount_min__gte = 100000, amount_max__lte = 300000))
以下是观察到的输出,
| amount | amount_min | amount_max | 
|---|---|---|
| 25000 | 0 | 0 | 
| 0 | 100000 | 300000 | 
然而,预期输出应该是,
| amount | amount_min | amount_max | 
|---|---|---|
| 0 | 100000 | 300000 | 
有人可以帮我解决这个查询吗?
英文:
I have two columns,
For single amount value amount and for range amount values amount_min and amount_max
| amount | amount_min | amount_max | 
|---|---|---|
| 25000 | 0 | 0 | 
| 0 | 100000 | 300000 | 
Using the following query,
Jobs.objects.filter(Q(created_on__gte = datetime.datetime.now() - datetime.timedelta(days=30)),Q(amount__range=(100000, 300000)) | Q(amount_min__gte = 100000, amount_max__lte = 300000))
Following is the observed output,
| amount | amount_min | amount_max | 
|---|---|---|
| 25000 | 0 | 0 | 
| 0 | 100000 | 300000 | 
However the expected output should be,
| amount | amount_min | amount_max | 
|---|---|---|
| 0 | 100000 | 300000 | 
Can anyone please help me in this query ?
答案1
得分: 2
你可以使用Q对象来结合条件并使用OR运算符(|)。
试试这个:
from django.db.models import Q
import datetime
Jobs.objects.filter(
    created_on__gte=datetime.datetime.now() - datetime.timedelta(days=30),
    Q(amount_min=0, amount_max=0) |
    Q(amount_min__gte=100000, amount_min__lte=100000, amount_max__gte=300000, amount_max__lte=300000) |
    Q(amount__range=(100000, 300000))
)
英文:
You can use the Q object to combine the conditions with OR operator (|).
Give this a try:
from django.db.models import Q
import datetime
Jobs.objects.filter(
    created_on__gte=datetime.datetime.now() - datetime.timedelta(days=30),
    Q(amount_min=0, amount_max=0) |
    Q(amount_min__gte=100000, amount_min__lte=100000, amount_max__gte=300000, amount_max__lte=300000) |
    Q(amount__range=(100000, 300000))
)
答案2
得分: 0
我认为你在处理 Q 方面遇到了问题,因为它不喜欢与普通命名参数结合使用。
命名参数示例:created_on__gte = datetime.datetime.now() - datetime.timedelta(days=30)
我个人的做法是过度包装 Q 语句并非常谨慎,例如:
Jobs.objects.filter(
    Q(created_on__gte = datetime.datetime.now() - datetime.timedelta(days=30))
    & Q(
      Q(
          Q(amount_min__gte = 100000)
          & Q(amount_min__lte = 100000)
          & Q(amount_max__gte = 300000)
          & Q(amount_max__lte = 300000)
      )
      | Q(amount__range=(100000, 300000))
    )
)
是否有点过度?- 可能。
英文:
I think your running into issues with Q because it doesn't like being combined with normal named arguments
Named argument example: created_on__gte = datetime.datetime.now() - datetime.timedelta(days=30)
What I personally do is over-wrap Q statements and be very deliberate, ex:
Jobs.objects.filter(
    Q(created_on__gte = datetime.datetime.now() - datetime.timedelta(days=30))
    & Q(
      Q(
          Q(amount_min__gte = 100000)
          & Q(amount_min__lte = 100000)
          & Q(amount_max__gte = 300000)
          & Q(amount_max__lte = 300000)
      )
      | Q(amount__range=(100000, 300000))
    )
)
Overkill?- Probably.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论