sagar limbu
sagar limbu

Reputation: 1262

The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance

I am using Django Rest and my request parameter contains:

[
{
    "job_role": 2,
    "technology": 1
},
{
    "job_role": 1,
    "technology": 1
},
{
    "job_role": 2,
    "technology": 1
}
]

My models are:

class Technology(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class JobRole(models.Model):
    role_name = models.CharField(max_length=100)

    def __str__(self):
        return self.role_name

class ExpertPricing(models.Model):
    role_name = models.OneToOneField(JobRole, related_name="role", on_delete=models.SET_NULL, null=True)
    experience_in_years = models.PositiveBigIntegerField()
    technology = models.OneToOneField(Technology, related_name="technology", on_delete=models.SET_NULL, null=True)
    salary_per_month = models.PositiveBigIntegerField()

My view looks like this:

class PricingView(APIView):
    
    def post(self, request):
        datas = request.data
        data_list = []
        for data in datas:
            job_role_id = data["job_role"]
            technology_id = data["technology"]

            job_role = JobRole.objects.get(pk=job_role_id)
            technology = Technology.objects.get(pk=technology_id)
            expert_pricing = ExpertPricing.objects.filter(role_name=job_role, technology=technology)
            if expert_pricing:
                data_list.append(expert_pricing)
        serializer = ExpertPricingSerializer(data_list, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

serializers.py

class TechnologySerializer(serializers.ModelSerializer):
    class Meta:
        model = Technology
        fields = ("id", "name")


class JobRoleSerializer(serializers.ModelSerializer):
    class Meta:
        model = JobRole
        fields = ("id","role_name")


class ExpertPricingSerializer(serializers.ModelSerializer):
    role = JobRoleSerializer(many=False, read_only=True)
    technology = TechnologySerializer(many=False, read_only=True)
    class Meta:
        model = ExpertPricing
        fields = "__all__"

I am unable to understand why data_list is not being serialized.

the error says:

AttributeError: Got AttributeError when attempting to get a value for field `experience_in_years` on serializer `ExpertPricingSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance.
Original exception text was: 'QuerySet' object has no attribute 'experience_in_years'.

Upvotes: 0

Views: 13495

Answers (2)

amir avira
amir avira

Reputation: 59

In my case, the problem was that I was not selecting a certain element from the list when writing the filter.

> amir =Student.objects.filter(first_name='amir')

I was trying to find the existence of Amir. But basically, because the output of my filter had an element in the list, I had to add [0] at the end of the filter line. like this:

> amir =Student.objects.filter(first_name='amir')[0]

This problem actually occurs when writing the filter incompletely and shows itself at the stage of using the serializer, which is very confusing.

Upvotes: 1

aberkb
aberkb

Reputation: 674

Since you defined in your model that those two fields (experience_in_years and salary_per_month) can not be empty, it seems like you need to do one of these things:

  1. Send experience_in_years and salary_per_month fields in your request too.
  2. Give a default value to those fields
  3. Make it null=True, blank=True

If you do 2 or 3 those solutions require migration, keep that in mind, after doing one of those things you should be good to go

Upvotes: 1

Related Questions