Django Rest - Использование SerializerMethodField и получение ошибки: объект 'QuerySet' не имеет атрибута 'birth_date'
Я новичок в Django и API в целом, и я хочу создать API на базе Django, используя Django Rest Framework.
Вот что я хочу сделать:
Конечная точка отчета о возрастном диапазоне:
curl -H 'Content-Type: application/json' localhost:8000/reports/employees/age/
Ответ:
{
"younger": {
"id": "1",
"name": "Anakin Skywalker",
"email": "skywalker@ssys.com.br",
"department": "Architecture",
"salary": "4000.00",
"birth_date": "01-01-1983"},
"older": {
"id": "2",
"name": "Obi-Wan Kenobi",
"email": "kenobi@ssys.com.br",
"department": "Back-End",
"salary": "3000.00",
"birth_date": "01-01-1977"},
"average": "40.00"
}
Вот мой код на данный момент:
employees/model.py:
class Employee(models.Model):
name = models.CharField(max_length=250, default='FirstName LastName')
email = models.EmailField(max_length=250, default='employee@email.com')
departament = models.CharField(max_length=250, default='Full-Stack')
salary = models.DecimalField(max_digits=15, decimal_places=2, default=0)
birth_date = models.DateField()
employees/serializers.py:
class EmployeeSerializer(serializers.ModelSerializer):
age = serializers.SerializerMethodField()
class Meta:
model = Employee
fields = ['id', 'name', 'email', 'departament', 'salary', 'birth_date', 'age']
def get_age(self, obj):
delta = datetime.now().year - obj.birth_date.year
return delta
class EmployeeAgeReportSerializer(serializers.Serializer):
youngest = EmployeeSerializer()
oldest = EmployeeSerializer()
# average = serializers.FloatField()
def create(self, validated_data):
pass
def update(self, instance, validated_data):
pass
employees/views.py:
class EmployeeGenericViewSet(
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet
):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
lookup_field = 'pk'
В employees/services.py у меня есть:
class EmployeeAgeReport:
def __init__(self, youngest, oldest):
self.youngest = youngest
self.oldest = oldest
# self.average = average
def get_employee_age_report():
age_report_dict = Employee.objects.aggregate(
earliest_birth_date=Min("birth_date"),
oldest_birth_date=Max("birth_date")
)
youngest_employee = Employee.objects.filter(
birth_date=age_report_dict.get("earliest_birth_date")
).first()
oldest_employee = Employee.objects.filter(
birth_date=age_report_dict.get("oldest_birth_date")
)
return EmployeeAgeReport(
youngest=youngest_employee,
oldest=oldest_employee
)
Но когда я пытаюсь получить доступ к http://localhost:8000/reports/employees/age/, я получаю эту ошибку:
Got AttributeError when attempting to get a value for field `birth_date` on serializer `EmployeeSerializer`.
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 'birth_date'.
Full Traceback:
Что я делаю неправильно и как это исправить?
Заранее спасибо.
Попробуйте это,
oldest_employee = Employee.objects.filter( birth_date=age_report_dict.get("oldest_birth_date") ) here add .first() in the end like you did for youngest_employee.
oldest_employee здесь вместо объекта получается список.