Объект QuerySet не имеет атрибута "email"

Я пытаюсь получить список всех патологоанатомов в моей системе. Мне нужно отфильтровать пользователей по 2 признакам, т.е. is_pathologist и Lab_Id=request.data[email]

Я пробовал переключаться между filter и get, но затем я получаю Authentication.models.User.MultipleObjectsReturned: get() вернул более одного пользователя - он вернул 12!

Это код моего представления

@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)

Это модель пользователя

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

Это модель сотрудника

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

Это сериализатор сотрудника

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

Вы путаете объекты и кверисеты, filter() возвращает кверисет, тогда как get() пытается вернуть объект. Ниже приведены причины ваших ошибок:

  1. Причина вашей ошибки с filter() заключается в том, что набор queryset - это, по сути, группа пользовательских объектов. Сам queryset не имеет атрибута email, но каждый пользовательский объект внутри группы имеет его. Поэтому вам нужно извлечь отдельного пользователя из queryset, используя first() или last(), например.
  2. Ваша ошибка с get() заключается в том, что ваши параметры слишком широки, и поэтому возвращается 12 пользователей. Вам нужно скорректировать свой код, чтобы справиться с этим, обычно это делается либо с помощью блока try/except, либо с помощью ярлыка get_object_or_404 Django. Как только вы успешно получили объект пользователя, вы можете вызвать user.email без проблем.
Вернуться на верх