Python 使用向后关系时的Django情况
我想注释“状态” 我需要:Python 使用向后关系时的Django情况,python,python-3.x,django,Python,Python 3.x,Django,我想注释“状态” 我需要: status=“Not Processed”如果至少一个反向相关forlistproduct具有status==ListProduct.status.Not_Processed status=“defect”如果至少有一个反向相关的forlistproduct具有状态==ListProduct.status.defect,并且没有一个具有状态==ListProduct.status.NOT_PROCESSED status=“Completed”如果向后相关forli
status=“Not Processed”
如果至少一个反向相关forlistproduct具有status==ListProduct.status.Not_Processed
status=“defect”
如果至少有一个反向相关的forlistproduct具有状态==ListProduct.status.defect,并且没有一个具有状态==ListProduct.status.NOT_PROCESSED
status=“Completed”
如果向后相关forlistproduct中至少有一个具有status==ListProduct.status.Completed
且没有一个具有status==ListProduct.status.NOT\u处理
我试过这个密码
def annotate_status(self):
return self.annotate(status=Case(
When(
forlistproduct_set__status=ListProduct.Status.NOT_PROCESSED,
then=Value("Not Processed")
),
When(
Q(forlistproduct_set__status=ListProduct.Status.DEFICIT) &
~Q(forlistproduct_set__status=ListProduct.Status.NOT_PROCESSED),
then=Value("Deficit")
),
When(
Q(forlistproduct_set__status=ListProduct.Status.COMPLETED) &
~Q(forlistproduct_set__status=ListProduct.Status.DEFICIT) &
~Q(forlistproduct_set__status=ListProduct.Status.NOT_PROCESSED),
then=Value("Completed")
), output_field=CharField()
))
但它在下面提出了一个例外
Traceback (most recent call last):
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/production_api/views.py", line 74, in retrieve
return super().retrieve(self, request, *args, **kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/mixins.py", line 54, in retrieve
instance = self.get_object()
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/generics.py", line 96, in get_object
obj = get_object_or_404(queryset, **filter_kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/rest_framework/generics.py", line 19, in get_object_or_404
return _get_object_or_404(queryset, *filter_args, **filter_kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/django/shortcuts.py", line 76, in get_object_or_404
return queryset.get(*args, **kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/nplusone/core/signals.py", line 23, in wrapped
ret = func(*args, **kwargs)
File "/Users/nizhdanchik/PycharmProjects/UpworkProjects/SlopehelperERP/backend/venv/lib/python3.9/site-packages/django/db/models/query.py", line 433, in get
raise self.model.MultipleObjectsReturned(
production_api.models.List.MultipleObjectsReturned: get() returned more than one List -- it returned 6!
我可以用反向关系来做这件事吗