Python 使用其他模型的对象过滤对象

Python 使用其他模型的对象过滤对象,python,django,filter,Python,Django,Filter,我有父母、名字和孩子模型: models.py 我有一个查看功能,仅当与父对象相关的子对象都在字典中时,才显示父对象: views.py 如果我想用模型对象替换模式字典,比如: class Pattern(models.Model): title = models.CharField(max_length=250) class PatternItems(models.Model): name = models.ForeignKey(Name) age = models

我有父母、名字和孩子模型:

models.py

我有一个查看功能,仅当与父对象相关的子对象都在字典中时,才显示父对象:

views.py

如果我想用模型对象替换模式字典,比如:

class Pattern(models.Model):
    title = models.CharField(max_length=250)


class PatternItems(models.Model):
    name = models.ForeignKey(Name)
    age = models.integer()
    city = models.CharField(max_length=250)
    pattern = models.ForeignKey(Pattern) 
所以不用字典。我想知道是否可以从模式模型中选择一个模式来显示父对象,如果它的所有相关子对象都在使用模式对象的模式项中

整个想法是使过滤器动态化,并允许用户制作自己的过滤器


帮助?

您可以替换这段代码:

patterns = [
    {'name__title': 'samy', 'age__lt': 15, 'city': 'paris'},
    {'name__title': 'sally', 'age__gt': 20, 'city': 'london'}
]
filter_q = reduce(operator.or_, map(lambda p: Q(**p), patterns))
通过一个循环,您可以添加任意数量的过滤器:

# init patterns as a list of PatternItems
patterns = [ PatternItem(name=Name(title='samy'), age=15, city='paris'),
             PatternItem(name=Name(title='sally'), age=20, city='london'),
           ]
# iterate through the list normally
filters = []
for pt_item in patterns:
    filters.append(Q(name__title=pt_item.name.title) & 
                    Q(age__lt=pt_item.age) & Q(city=pt_item.city))

filter_q = filters[0]
for f in filters[1:]:
    filter_q |= f
获取模式的另一种方法是评估查询集,例如使用:

这种方法的唯一问题是,必须对列表中的每个模式项使用相同的比较,即年龄


请注意:我使用循环而不是reduce函数,因为它在Python3中不存在。

所以这里是我的问题的答案,可能不清楚。 @保罗·斯特凡的密码非常接近我的需要

view.py

唯一的区别是: patterns=PatternItems.objects.filterpattern\uu title='成人'


它使用所需的模式“成人”筛选patternitems。

我在哪里指定模式名称?@djangouy在上述代码中,通过将PatternItem.name设置为现有名称实例来指定名称。或者-更简单-您可以将PatternItem.name字段更改为CharField,并改用Qname\uuuu title=pt\u item.name。假设我有一个名为“成人”的模式,其中有X个与之相关的PatternItems。在您编写的代码中,我在哪里写“成人”?@djangogay假设在成人中,PatternItems位于名为PatternItems的查询集中,将第3行更改为for pr_item in成人。PatternItems。all:在使用filter_q之前,我必须导入一些内容吗?因为我的编辑不认识它。我还发现此错误“ModelBase”对象不适用于模式中的pt_项:
patterns = [
    {'name__title': 'samy', 'age__lt': 15, 'city': 'paris'},
    {'name__title': 'sally', 'age__gt': 20, 'city': 'london'}
]
filter_q = reduce(operator.or_, map(lambda p: Q(**p), patterns))
# init patterns as a list of PatternItems
patterns = [ PatternItem(name=Name(title='samy'), age=15, city='paris'),
             PatternItem(name=Name(title='sally'), age=20, city='london'),
           ]
# iterate through the list normally
filters = []
for pt_item in patterns:
    filters.append(Q(name__title=pt_item.name.title) & 
                    Q(age__lt=pt_item.age) & Q(city=pt_item.city))

filter_q = filters[0]
for f in filters[1:]:
    filter_q |= f
# any_column__gte and value here are just examples
patterns = PatternItem.objects.filter(any_column__gte=value)
# iterate through the patterns using .all()
filters = []
for pt_item in patterns.all():
    ...
patterns = PatternItems.objects.filter(pattern__title='adults')
filters = []
for pt_item in patterns.all():
    filters.append(Q(name__title=pt_item.name.title) &
                   Q(age__lt=pt_item.age) & Q(city=pt_item.city))

filter_q = filters[0]
for f in filters[1:]:
    filter_q |= f
qs = Kid.objects.filter(filter_q).values_list('id', 'family_id')
family_ids = set()
child_ids = list()
for child_id, family_id in qs:
    family_ids.add(family_id)
    child_ids.append(child_id)
incomplete_family_ids = set(Kid.objects.exclude(id__in=child_ids).filter(family_id__in=family_ids).values_list('family_id', flat=True).distinct())
complete_family_ids = family_ids - incomplete_family_ids
parents = Parent.objects.filter(id__in=complete_family_ids)
template = 'index.html'
context = {'parents': parents}
return render(request, template, context)