Django:反转状态的端点不起作用
Django: endpoint to reverse status not working
我正在学习和试验 DRF。
我正在学习创建路线(端点)以对我的模型进行自定义修改的操作。
我已成功构建:deactivate
、deactivate_all
、activate_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
之外使用它,但是 举个例子。
我正在学习和试验 DRF。
我正在学习创建路线(端点)以对我的模型进行自定义修改的操作。
我已成功构建:deactivate
、deactivate_all
、activate_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
之外使用它,但是