Django查询条件字段选择器

时间:2018-03-22 12:40:07

标签: django conditional

class Parent(models.Model):
    name = models.CharField(max_length=255, blank=False)

class Child(models.Model):
    parent = models.ForeignKey(Warehouse, related_name="children")    
    name = models.CharField(max_length=255, blank=True)

需要通过某些术语儿童应用搜索:

如果儿童 名称不为空或不为空,则我们将 term Child &#39> name else - 将 term Parent name 进行比较。

类似的东西:

search_result = Child.objects.filter(
    if 
        Q(name__isnull=True) | Q(name='') 
    then 
        parent__name__icontains=term
    else 
        name__icontains=term
)

以便:

parent = Parent(name="Smith").save()
ch1 = Child(parent=parent, name="Smithson").save()
ch2 = Child(parent=parent, name="Watson").save()
ch3 = Child(parent=parent).save()

按术语搜索"史密斯"会导致:

[ch1, ch3]

2 个答案:

答案 0 :(得分:1)

您可以使用多个带有()符号的Q对象。

from django.db.models import Q 
search_result = Child.objects.filter(
    ((Q(name__isnull=True) | Q(name='')) & Q(parent__name__icontains=term)) |
    (Q(name__isnull=False) & Q(name__icontains=term))
)

这意味着匹配((Q(name__isnull=True) | Q(name='')) & Q(parent__name__icontains=term)) 这个条件或匹配(Q(name__isnull=False) & Q(name__icontains=term))

参考:Django ORM conditional filter LIKE CASE WHEN THEN

答案 1 :(得分:0)

没有经过测试但是这样的事情:

{{1}}