[英]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.