如果空字段返回所有元素,则Django中的Queryset

时间:2017-11-17 21:21:29

标签: django django-forms django-queryset

我想在Django中使用form方法进行过滤。 如果用户输入de var,它应该在数据集中查询var,如果它留空则应该带来所有元素。

我该怎么做?

我是Django的新手

if request.GET.get('Var'):
    Var = request.GET.get('Var')
else:
    Var = WHAT SHOULD I PUT HERE TO FILTER ALL THE ELEMNTS IN THE CODE BELLOW

models.objects.filter(Var=Var)

2 个答案:

答案 0 :(得分:2)

更简单,更明确的方法是:

foreach (SearchResult result in matchingADGroups)
{
    // Here I need to get result's child object properties(could be multiple children)
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + result.Path.Substring(7));

    foreach(DirectoryEntry child in entry.Children)
    {
        Shortcut shortcut = new Shortcut();
        shortcut.DisplayName = (string)child.Properties["myDisplayName"].Value;
        shortcut.Id = (string)child.Properties["myId"].Value;

        shortcuts.Add(shortcut);
    }
}

答案 1 :(得分:1)

从安全的角度来看,允许用户直接将数据输入到搜索字词中并不是一个好主意(如果您正在使用其中的任何一个,那么对于原始SQL查询应该不会这样做。)< / p>

考虑到这一点,您可以使用字典语法来利用更多动态过滤器创建,或者在查询集的过程中修改它:

选项1:字典语法

def my_view(request):
  query = {}
  if request.GET.get('Var'):
     query['Var'] = request.GET.get('Var')
  if request.GET.get('OtherVar'):
    query['OtherVar'] = request.GET.get('OtherVar')
  if request.GET.get('thirdVar'):
    # Say you wanted to add in some further processing
    thirdVar = request.GET.get('thirdVar')
    if int(thirdVar) > 10:
       query['thirdVar'] = 10
    else:
       query['thirdVar'] = int(thirdVar)
  if request.GET.get('lessthan'):
    lessthan = request.GET.get('lessthan')
    query['fieldname__lte'] = int(lessthan)
  results = MyModel.objects.filter(**query)

如果查询字典中没有添加任何内容并且它是空的,则该等同于执行MyModel.objects.all()

如果您想尝试做类似的事情(这可能是一个坏主意),我上面的安全说明适用:

MyModel.objects.filter(**request.GET)

Django拥有良好的安全跟踪记录,但这比预测用户将拥有的查询类型更不安全。如果恶意网站用户知道您的架构可以调整其查询语法以在非索引字段中进行大量查询,那么这也可能是一个大问题。

选项2:修改查询集 或者,您可以从所有内容的查询集开始,然后相应地过滤

def my_view(request):
  results = MyModel.objects.all()
  if request.GET.get('Var'):
     results = results.filter(Var=request.GET.get('Var'))
  if request.GET.get('OtherVar'):
    results = results.filter(OtherVar=request.GET.get('OtherVar'))
  return results