Django:反转状态的端点不起作用

Django: endpoint to reverse status not working

我正在学习和试验 DRF。

我正在学习创建路线(端点)以对我的模型进行自定义修改的操作。

我已成功构建:deactivatedeactivate_allactivate_all

但不是reverse_status,意思是把一个客户现在的状态改成相反的。如果 customer.active = True,这会将其更改为 False,反之亦然。

我的操作:

@action(detail=False, methods=['PUT']) #when true only applies to 1 object / else to a list of objects
def reverse_status(self, request, **kwargs):
    customers = Customer.objects.all()
    import pdb; pdb.set_trace()
    customers = [customer.update(active=False) for customer in customers if customer.active]            
    serializer = CustomerSerializer(customers, many=True)
    return Response(serializer.data) 

正如您所注意到的,我设置了一个断点以查看客户在列表理解后持有什么,但它被转换为一个空列表:

原文:

<QuerySet [<Customer: Gregory>, <Customer: Julia>, <Customer: Naty>]>

列表理解后:

[]

为什么?

尝试这样的事情:

@action(detail=False, methods=['PUT'])
def reverse_status(self, request, **kwargs):
    active_customers = Customer.objects.filter(active=True)
    active_customers.update(active=False)
    serializer = CustomerSerializer(active_customers, many=True)
    return Response(serializer.data)

更新:解决实际意图,这是双向反转

这应该可以解决问题:

@action(detail=False, methods=['PUT'])
def reverse_status(self, request, **kwargs):
    Customer.objects.update(active=Q(active=False))
    serializer = CustomerSerializer(Customer.objects.all(), many=True)
    return Response(serializer.data)

这里 Q(active=False) 构造实现了翻转布尔值的魔法。

更新 2:更新 Q 中的注释非常不完整

Q 上的 doc 有点短而且没有结尾。有大量关于在过滤器表达式中使用它的示例,但描述暗示了更一般的用法:

A Q() object, like an F object, encapsulates a SQL expression in a Python object that can be used in database-related operations.

In general, Q() objects make it possible to define and reuse conditions. This permits the construction of complex database queries using | (OR) and & (AND) operators; in particular, it is not otherwise possible to use OR in QuerySets.

短语 "define and reuse conditions" 显然是一个非常有力和笼统的陈述。老实说,我不确定我是在哪里第一次了解到您可以在 filter 之外使用它,但是 举个例子。