问题描述
这是在用户提供的范围内过滤比赛开始日期和结束日期,下面是相同的代码,但我想提供字段名称(此处:deadlines__start_date)和look_up类型(此处: __lte,__gte)。以及用户提供的范围字段 self.start_date 和 self.end_date。
return qs.filter((Q(deadlines__start_date__gte=self.start_date) & Q(deadlines__end_date__lte=self.end_date))|
(Q(deadlines__start_date__lte=self.start_date) & Q(deadlines__end_date__lte=self.end_date) & Q(deadlines__end_date__gte=self.start_date)) |
(Q(deadlines__start_date__lte=self.start_date) & Q(deadlines__end_date__gte=self.end_date)) |
(Q(deadlines__start_date__gte=self.start_date) & Q(deadlines__end_date__gte=self.end_date) & Q(deadlines__start_date__lte=self.end_date))
)
this was working fine but Now I want to send field names and look_up types and values to be compared dynamically,but not finding any solution. ```
I tried doing it like below:
kwargs0 = {str('%s__gte' % (start_field)) : str('%s' % self.start_date)}
kwargs1 = {str('%s__lte' % (end_field)) : str('%s' % self.end_date)}
kwargs2 = {str('%s__lte' % (start_field)) : str('%s' % self.start_date)}
kwargs3 = {str('%s__lte' % (end_field)) : str('%s' % self.end_date)}
kwargs4 = {str('%s__gte' % (end_field)) : str('%s' % self.start_date)}
kwargs5 = {str('%s__lte' % (start_field)) : str('%s' % self.start_date)}
kwargs6 = {str('%s__gte' % (end_field)) : str('%s' % self.end_date)}
kwargs7 = {str('%s__gte' % (start_field)) : str('%s' % self.start_date)}
kwargs8 = {str('%s__gte' % (end_field)) : str('%s' % self.end_date)}
kwargs9 = {str('%s__lte' % (start_field)) : str('%s' % self.end_date)}
q_object= Q()
q_object.add(Q(**kwargs0),Q.AND)
q_object.add(Q(**kwargs1),Q.OR)
q_object.add(Q(**kwargs2),Q.AND)
q_object.add(Q(**kwargs3),Q.AND)
q_object.add(Q(**kwargs4),Q.OR)
q_object.add(Q(**kwargs5),Q.AND)
q_object.add(Q(**kwargs6),Q.OR)
q_object.add(Q(**kwargs7),Q.AND)
q_object.add(Q(**kwargs8),Q.AND)
q_object.add(Q(**kwargs9),Q.AND)
return qs.filter(q_object)
上下文:我一直在寻找有关如何动态添加字段的解决方案,并且已经走到了这一步。
I beleive the errors are in how I am giving Q.AND and Q.OR arguments and that is creating wrong query,how to do this?
but am getting empty query set as output.
HELP!!!
解决方法
rtom_value = literal_column('rtom.value',type_=JSONB)
query = self.session().query(RatePlan).filter(
self.session().query().select_from(func.jsonb_array_elements(self._model.room_type_occupancy_mappings).alias('rtom'))
.filter(tuple_(rtom_value['room_type_id'].astext,rtom_value['adult_count'].astext.cast(Integer)
).in_([('RT02',2),('RT03',1)])).exists())
像这样格式化 Q 对象。