Django查询条件字段选择器

Django查询条件字段选择器,django,conditional,Django,Conditional,需要通过某些术语从孩子处进行搜索,说明: 若子项的名称不为空或不为NULL,则我们将术语与子项的名称进行比较,否则-将术语与父项的名称进行比较 比如: class Parent(models.Model): name = models.CharField(max_length=255, blank=False) class Child(models.Model): parent = models.ForeignKey(Warehouse, related_name="child

需要通过某些术语从孩子处进行搜索,说明:

若子项的名称不为空或不为NULL,则我们将术语与子项的名称进行比较,否则-将术语与父项的名称进行比较

比如:

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)
以便:

search_result = Child.objects.filter(
    if 
        Q(name__isnull=True) | Q(name='') 
    then 
        parent__name__icontains=term
    else 
        name__icontains=term
)
按术语smith搜索的结果如下:

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]

可以使用多个带有符号的Q对象

这意味着匹配Qname_uuisnull=True | Qname=&Qparent_uuuname_uuuicontains=term 此条件或匹配项Qname\uuuu isnull=False&Qname\uuuuu icontains=term


参考:

杜德写一些解释,添加一些你的作品。
name = "smith"
Child.objects.filter(Q(name__iexact=name) or Q(name=None) & Q(parent__name__iexact=name))
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))
)