【问题标题】:django filters open_hours close_hours SyntaxError: positional argument follows keyword argumentdjango 过滤器 open_hours close_hours SyntaxError: 位置参数跟随关键字参数
【发布时间】:2019-09-23 10:56:07
【问题描述】:

我试图制作过滤方法来检查我的地方(模型在下面)现在是否打开。我定义了字段 open_hours 和 close_hours。算法对我来说看起来很不错(第一个条件适用于 21:00-23:00 小时和第二个 21:00-01:00)但是由于我在 Q 和 F 对象中是一个新手,所以我得到了 syntaxError。

第 81 行 Q(open_hours__lt = current_time) & Q(close_hours__gt = current_time)) ^ SyntaxError: 位置参数跟随关键字参数

class Place(models.Model):
name = models.CharField(max_length=50)
lat = models.FloatField()
lng = models.FloatField()
address = models.CharField(max_length=50)
district = models.CharField(max_length=50, choices=DISTRICTS)
link = models.URLField(help_text="www.websiteurl.pl")
open_hours = models.TimeField()
close_hours = models.TimeField()
week_day = MultiSelectField(choices=DAYS)
additionalInfo = models.CharField(max_length=500, blank=True, null=True)

def __str__(self):
    return self.name




def hasToBeOpenedRightNowFilter(self, queryset, name, value):
    now = datetime.datetime.now()                                               
    current_day = now.strftime("%A")                                        #current_day
    current_time = now.time()                                               #current_time

    queryset_day = queryset.filter(week_day__contains = current_day)        #queryset filtered after day
    query_time_1 = queryset.filter(open_hours__lt = F('close_hours'),       #queryset filtered after first condition
    Q(open_hours__lt = current_time) & Q(close_hours__gt = current_time))       
    query_time_2 = queryset.filter(open_hours__gt = F('close_hours'),       #queryset filtered after second condition
    Q(open_hours__lt = current_time) | Q(close_hours__gt = current_time))
    queryset_time = query_time_1 | query_time_2                             #merge two querysets with time conditions
    queryset_true = queryset_time & queryset_day                            #merge queryset with filter after day
    if not value:
        queryset = queryset.exclude(id__in=queryset_true.values('id'))
        return queryset
    return queryset_true

【问题讨论】:

    标签: python django django-filters


    【解决方案1】:

    你需要先把Q对象放在.filter

    query_time_1 = queryset.filter(Q(open_hours__lt = current_time) & Q(close_hours__gt = current_time), open_hours__lt = F('close_hours')) 
    

    【讨论】:

    • 哦,那是有道理的。谢谢你:))))
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2019-04-23
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多