-1

I am trying to get a list of all pathologists in my system. I need to filter the user on 2 basis i-e is_pathologist and Lab_Id=request.data[email]

I have tried switching between filter and get but then I get Authentication.models.User.MultipleObjectsReturned: get() returned more than one User -- it returned 12! Error traceback here

This is the code of my view

@api_view(['POST'])
def getAllPathologists(request):
    user = get_user_model().objects.get(is_pathologist=True)
        # If user exists, get the employee
    print("user is: ", user)
    pathologist = Employee.objects.get(user=user.email, Lab_Id=request.data['email'])
    pathologistSerializer = EmployeeSerializer(pathologist, many=True)
    return Response(pathologistSerializer.data)

This is user model

class User(AbstractUser):
    # Add additional fields here
    id = None
    email = models.EmailField(max_length=254, primary_key=True)
    name = models.CharField(max_length=100)
    password = models.CharField(max_length=100)
    contact_number = models.CharField(max_length=100)
    is_patient = models.BooleanField(default=False)
    is_doctor = models.BooleanField(default=False)
    is_homesampler = models.BooleanField(default=False)
    is_pathologist = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_lab = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now=True,editable=False)
    last_login = models.DateTimeField(auto_now=True)
    first_name = None
    last_name = None
    username = None

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name', 'password']
    objects = CustomUserManager()

    def __str__(self):
        return self.email

    # Ensure that the password is hashed before saving it to the database
    def save(self, *args, **kwargs):
        self.password = make_password(self.password)
        super(User, self).save(*args, **kwargs)

    def has_perm(self, perm, obj=None):
        return self.is_superuser

This is Employee model

class Employee(models.Model):
    user = models.OneToOneField(
        get_user_model(), on_delete=models.CASCADE, primary_key=True)
    CNIC = models.CharField(max_length=100, unique=True)
    Lab_Id = models.ForeignKey(Lab, on_delete=models.CASCADE)

    def __str__(self):
        return self.user.name

This is employee serializer

class EmployeeSerializer(serializers.ModelSerializer):
    userData = UserSerializer(read_only=True, source='user')
    email = serializers.EmailField(write_only=True)
    password = serializers.CharField(write_only=True)
    name = serializers.CharField(write_only=True)
    contact_number = serializers.CharField(write_only=True)
    is_homesampler = serializers.BooleanField(write_only=True)

    class Meta:
        model = Employee
        # fields = " __all__"
        fields = ["CNIC", "Lab_Id", "userData",
                  "name", "contact_number", "email", "password", "is_homesampler"]

    def create(self, validated_data):
        print("validated data = ", validated_data)
        email = validated_data.pop("email")
        password = validated_data.pop("password")
        name = validated_data.pop("name")
        contact_number = validated_data.pop("contact_number")
        is_homesampler = validated_data.pop("is_homesampler")
        user = get_user_model().objects.create_user(
            email=email, password=password, name=name, contact_number=contact_number)
        if (is_homesampler):
            user.is_homesampler = True
        else:
            user.is_pathologist = True
        user.save()

        EmployeeObj = Employee.objects.create(user=user, **validated_data)
        return EmployeeObj
alish
  • 1
  • 4

1 Answers1

0

You are getting objects and querysets conflated, filter() will return a queryset whereas get() tries to return an object. Below are the reasons for your errors:

  1. The reason for your error with filter() is that a queryset is essentially a group of user objects. The queryset itself has no attribute email, but each user object within the group would. You therefore need to extract a single user from the queryset using first() or last(), for example.
  2. Your error with get() is that your parameters are too broad and thus 12 users are returned. You need to adjust your code to handle this, it's usually done with either a try/except block or using the get_object_or_404 Django shortcut. Once you successfully get the user object, you can call user.email without issue.
0sVoid
  • 2,547
  • 1
  • 10
  • 25