繁体   English   中英

通过许多关系过滤对象

[英]Filter objects by manytomany relation

找不到解决多对多关系的好方法。

class Scheduler(models.Model):
    weekhours = models.ManyToManyField('WeekHour', related_name='schedulers')

    def get_active_products_by_weekhour(self,weekhour):
        return Product.objects.filter(scheduler__in=WeekHour.objects.get(hour=weekhour).schedulers.all())


class WeekHour(models.Model):
    hour = models.PositiveSmallIntegerField(verbose_name='Hour in week (0 - 7*24')

现在假设我有一个数字列表,例如:

hours = [2,4,6]

我想找到一个带有这些hour值的WeekHour对象的确切集合的WeekHour

因此,仅当在本周中设置了某些时间时才返回调度程序[WeekHour(hour=2),WeekHour(hour=4),WeekHour(hour=6)] 因此,相关WeekHours的数量必须与列表的大小相同。 在这种情况下3。

是否可以使用Django orm而不使用循环?

编辑:

那这个呢?

weekhours_set = [Weekhour.objects.get(hour=x) for x in hours]
scheduler = Scheduler.objects.filter(weekhours__exact=weekhours_set)

返回:

TypeError:int()参数必须是字符串或数字,而不是“列表”

__exact期望与字段类型具有相同的类型。

您应该考虑使用__in ,然后在operator.and_上链接Q表达式,以过滤与所有相关对象的id有关系的确切对象:

import operator
from django.db.models import Q

weekhours_set = Weekhour.objects.filter(hour__in=hours).values_list('id', flat=True)
schedulers = Scheduler.objects.filter(reduce(operator.and_, [Q(weekhours__id=id) for id in weekhours_set]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM