Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-基于多对多关系获取查询结果_Python_Django_Django Queryset - Fatal编程技术网

Python Django-基于多对多关系获取查询结果

Python Django-基于多对多关系获取查询结果,python,django,django-queryset,Python,Django,Django Queryset,给定以下模型和通过URI GET的字符串数组,如何有效地执行筛选操作并返回所有Trail匹配项 class Trail(models.Model): ''' Main model for this application. Contains all information for a particular trail ''' trail_name = models.CharField(max_length=150) active = models.Boo

给定以下模型和通过URI GET的字符串数组,如何有效地执行筛选操作并返回所有
Trail
匹配项

class Trail(models.Model):
    '''
    Main model for this application.  Contains all information for a particular trail
    '''
    trail_name = models.CharField(max_length=150)
    active = models.BooleanField(default=True)
    date_uploaded = models.DateTimeField(default=now())
    owner = models.ForeignKey(Account, default=1)

class Surface(models.Model):
    '''
    A many to many join table to map a surface type to many trails.  A trail can have many
    surface types.
    '''
    type = models.CharField(max_length=50, db_column='surface_type', unique=True)
    trails = models.ManyToManyField(Trail)

    class Meta:
        ordering = ('type', )
天真地说,我可以得到所有的跟踪模型,并通过迭代获得匹配项,但我希望有一种更有效的方法

我尝试过这样做:

from django.models.db import Q

#List of strings as a result of a URL querystring like
#?keys=Dirt&keys=Gravel&keys=Paved
keys = request.GET.getlist('keys')

queries = [Q(type = surface) for surface in keys]
query = queries.pop()

for item in queries:
     query |= item

results = Trail.objects.filter(surface=type)

但这将返回一个
ValueError:invalid literal for int(),以10为基数:
异常。

这里根本不需要使用
Q
。您可能拥有一个与曲面对象的
类型
字段相对应的字符串列表,并且您希望获得与这些曲面相关的轨迹。您可以使用中的\uu查询多个曲面类型,也可以使用双下划线关系跨越曲面和轨迹之间的关系。因此:

Trail.objects.filter(surface__type__in=request.GET.getlist('keys'))

这里根本不需要使用
Q
。您可能拥有一个与曲面对象的
类型
字段相对应的字符串列表,并且您希望获得与这些曲面相关的轨迹。您可以使用中的\uu查询多个曲面类型,也可以使用双下划线关系跨越曲面和轨迹之间的关系。因此:

Trail.objects.filter(surface__type__in=request.GET.getlist('keys'))

键中有哪些值?是ID还是什么?编辑我的问题以澄清关键点。它们是从URL查询字符串中收集的字符串,格式为
?keys=dirty&keys=grade&keys=paded
keys
中的值是什么?是ID还是什么?编辑我的问题以澄清关键点。它们是从URL查询字符串中收集的字符串,格式为
?keys=dirty&keys=grade&keys=paded
Nice suggestion。但是,在使用它时,我似乎得到了重复的跟踪引用,因此有必要将
distinct()
添加到代码段的末尾。例如,如果我在测试数据库中只有一条轨迹,并且使用了两个曲面查询,那么我会得到两个轨迹对象。建议不错。但是,在使用它时,我似乎得到了重复的跟踪引用,因此有必要将
distinct()
添加到代码段的末尾。例如,如果我在测试数据库中只有一条轨迹,并且使用两个曲面查询,那么我将返回两个轨迹对象。