如何根据条件从查询集中删除项目,然后 return 作为 django 中的 json 响应
How to remove items from queryset based on condition and then return as json response in django
我正在使用 select_related() 进行连接操作并使用以下代码过滤记录
class ActiveclientViewSet(viewsets.ModelViewSet):
queryset = Ruledefinitions.objects.select_related('pmdclinicalruleid').filter(pmdclinicalruleid__effectivedate__lt = timezone.now(),pmdclinicalruleid__retireddate__gt = timezone.now())
serializer_class = RuledefinitionsSerializer
在上面的代码中,是否可以检查 queryset 中的第一个项目是否有 rulename 字段值为空,如果它是空的,我需要 return json 响应中剩余的 queryset 项目如果不为空 return 所有项目作为 json 响应。
检查第一个元素有什么问题?
class ActiveclientViewSet(viewsets.ModelViewSet):
queryset = Ruledefinitions.objects.select_related('pmdclinicalruleid')
serializer_class = RuledefinitionsSerializer
def get_queryset(self):
now = timezone.now
queryset = super().get_queryset().filter(
pmdclinicalruleid__effectivedate__lt=now,
pmdclinicalruleid__retireddate__gt=now,
)
first_item = queryset.first()
if first_item is not None and not first_item.rulename:
queryset = queryset[1:]
return queryset
您在 timezone.now() 上的过滤器仅执行一次:当您的类被定义时。所以任何对该方法的调用都不应该在类定义中,而是在每个请求中调用。
在您的实际实现中,一旦您启动服务器,就会立即调用 now。两周后,过滤器仍将处于同一日期。
我正在使用 select_related() 进行连接操作并使用以下代码过滤记录
class ActiveclientViewSet(viewsets.ModelViewSet):
queryset = Ruledefinitions.objects.select_related('pmdclinicalruleid').filter(pmdclinicalruleid__effectivedate__lt = timezone.now(),pmdclinicalruleid__retireddate__gt = timezone.now())
serializer_class = RuledefinitionsSerializer
在上面的代码中,是否可以检查 queryset 中的第一个项目是否有 rulename 字段值为空,如果它是空的,我需要 return json 响应中剩余的 queryset 项目如果不为空 return 所有项目作为 json 响应。
检查第一个元素有什么问题?
class ActiveclientViewSet(viewsets.ModelViewSet):
queryset = Ruledefinitions.objects.select_related('pmdclinicalruleid')
serializer_class = RuledefinitionsSerializer
def get_queryset(self):
now = timezone.now
queryset = super().get_queryset().filter(
pmdclinicalruleid__effectivedate__lt=now,
pmdclinicalruleid__retireddate__gt=now,
)
first_item = queryset.first()
if first_item is not None and not first_item.rulename:
queryset = queryset[1:]
return queryset
您在 timezone.now() 上的过滤器仅执行一次:当您的类被定义时。所以任何对该方法的调用都不应该在类定义中,而是在每个请求中调用。
在您的实际实现中,一旦您启动服务器,就会立即调用 now。两周后,过滤器仍将处于同一日期。