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 здесь вместо объекта получается список.

Вернуться на верх