2

I'm trying to perform a bit of complicated query in my rest api view so I can order my contacts in the right order, now as e4c5 suggested in my previous question I could do this Case annotation and build my custom annotation with CASE/WHEN and then use that in annotation in the order by, but now I'm getting ValueError at /api/sales/lead_contact/ The annotation 'status' conflicts with a field on the model so this is the custom annotation I'm trying to build so I can properly order contacts, one note is that I'm preforming this in rest view:

   class LeadContactViewSet(viewsets.ModelViewSet):
    def get_queryset(self):
        filter_date = self.request.query_params.get('filter_date', None)

        case_sql = LeadContact.objects.annotate(
            status=Case(
                When(status=LeadContactConstants.STATUS_CLIENT, then=Value('1')),
                When(status=LeadContactConstants.STATUS_QUALIFIED, then=Value('2')),
                When(status=LeadContactConstants.STATUS_CONTACTED, then=Value('3')),
                When(status=LeadContactConstants.STATUS_PRISTINE, then=Value('4')),
                default=Value('1'),
                output_field=CharField(),

            )
        ).values_list('status')

        if filter_date is not None:
            queryset = queryset.filter(next_action_date=filter_date).extra(select={'status': case_sql},
                                                                           order_by=['status'])

        return queryset

Model fields:

class LeadContact(models.Model):
    status = models.CharField(max_length=10,
  choices=LeadContactConstants.STATUSES, default=LeadContactConstants.STATUS_PRISTINE)

and the choices for this field:

class LeadContactConstants(object):
    STATUS_PRISTINE = "PRISTINE"
    STATUS_CONTACTED = "CONTACTED"
    STATUS_QUALIFIED = "QUALIFIED"
    STATUS_CLIENT = "CLIENT"

    STATUSES = ((STATUS_PRISTINE, "Virgin"),
                (STATUS_CONTACTED, "Contacted"),
                (STATUS_QUALIFIED, "Qualified"),
                (STATUS_CLIENT, "Client"))

Serializer class:

class LeadContactSerializer(serializers.ModelSerializer):
    account_handler = AccountHandlerSerializer()
    next_action_date = serializers.DateTimeField(format=settings.CUSTOM_DATE_FORMAT_NO_TIME)
    absolute_url = serializers.URLField(source='get_absolute_url')

    class Meta:
        model = LeadContact
        fields = (
            'pk', 'organization_name', 'sub_organization_name', 'serial_number', 'account_handler', 'status_text',
            'first_name', 'last_name', 'next_action_date', 'absolute_url', 'status_display_class'
        )
        depth = 1

Full Stack Trace:

Traceback:
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/rest_framework/viewsets.py" in view
  87.             return self.dispatch(request, *args, **kwargs)
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  466.             response = self.handle_exception(exc)
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  463.             response = handler(request, *args, **kwargs)
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/rest_framework/mixins.py" in list
  40.         queryset = self.filter_queryset(self.get_queryset())
File "/home/vagrant/vincluos/VincluCMSProject/vinclucms_sales/restapi/views/lead_contact_viewset.py" in get_queryset
  29.                 output_field=CharField(),
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/django/db/models/manager.py" in manager_method
  127.                 return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/vagrant/virtualenv/local/lib/python2.7/site-packages/django/db/models/query.py" in annotate
  793.                                  "the model." % alias)

Exception Type: ValueError at /api/sales/lead_contact/
Exception Value: The annotation 'status' conflicts with a field on the model.
Community
  • 1
  • 1
copser
  • 2,523
  • 5
  • 38
  • 73

1 Answers1

0
  1. As you can read the error message "'status' conflicts with a field on the model", here the error is telling you that LeadContact model already has a field status (you can see it on your model definition of LeadContact) that's why you're not able to annotate.
  2. Basically annotate tries to add a field to your queryset result in your case it is status as you have a model LeadContact with status field because of which you're not able to annotate.
  3. The Solution is you have to the field name other then status and choices. hope this helps.