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