我是 Django 和 API 的新手,我想使用 Django Rest Framework 創建一個基于 Django 的 API。
這是我想要做的:
端點到年齡范圍報告:
curl -H 'Content-Type: application/json' localhost:8000/reports/employees/age/
回復:
{
"younger": {
"id": "1",
"name": "Anakin Skywalker",
"email": "[email protected]",
"department": "Architecture",
"salary": "4000.00",
"birth_date": "01-01-1983"},
"older": {
"id": "2",
"name": "Obi-Wan Kenobi",
"email": "[email protected]",
"department": "Back-End",
"salary": "3000.00",
"birth_date": "01-01-1977"},
"average": "40.00"
}
工資范圍報告的端點:
curl -H 'Content-Type: application/json' localhost:8000/reports/employees/salary/
回復:
{
"lowest ": {
"id": "2",
"name": "Obi-Wan Kenobi",
"email": "[email protected]",
"department": "Back-End",
"salary": "3000.00",
"birth_date": "01-01-1977"},
"highest": {
"id": "3",
"name": "Leia Organa",
"email": "[email protected]",
"department": "DevOps",
"salary": "5000.00",
"birth_date": "01-01-1980"},
"average": "4000.00"
}
我有兩個應用程式,employees和reports.
這是員工/models.py:
class Employee(models.Model):
name = models.CharField(max_length=250, default='FirstName LastName')
email = models.EmailField(max_length=250, default='[email protected]')
departament = models.CharField(max_length=250, default='Full-Stack')
salary = models.DecimalField(max_digits=15, decimal_places=2, default=0)
birth_date = models.DateField()
這是員工/serializers.py:
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = ['id', 'name', 'email', 'departament', 'salary', 'birth_date']
我不確定如何為我的報表應用程式創建視圖和序列化程式。我應該如何處理這個?
如何在另一個欄位的值之間回傳一個額外的欄位?我應該在我的序列化程式中創建一個自定義欄位嗎?
通過閱讀檔案,我發現我應該使用的查詢應該是這樣的:
Employee.objects.aggregate(Max("salary"), Min("salary"), Avg("salary"))
或者,例如薪水:
Employee.objects.all().order_by('salary')
但是我將如何使用它呢?
我不知道在哪里使用或如何去做,因為我對 API 和 Django Rest Framework 的理解仍然非常缺乏。
它應該放在我的報告/view.py 中嗎?還是在我的員工/serializers.py中?
我應該創建一個報告/serializers.py檔案嗎?
我需要一個帶有, ,欄位和一個員工物件欄位的報告/模型類嗎?lowesthighestaverage
我應該在我的報告/views.py中覆寫我的班級的list()功能嗎?(這個類還不存在)ReportSalaryListAPIView
我非常迷茫和困惑。請幫我指出正確的方向。
先感謝您。
編輯:
我的employees/model.py現在看起來像這樣:
class Employee(models.Model):
name = models.CharField(max_length=250, default='FirstName LastName')
email = models.EmailField(max_length=250, default='[email protected]')
departament = models.CharField(max_length=250, default='Full-Stack')
salary = models.DecimalField(max_digits=15, decimal_places=2, default=0)
birth_date = models.DateField()
@property
def get_age(self):
delta = relativedelta(self.birth_date.days, datetime.today()).years
return delta
def save(self, *args, **kwargs):
self.age = self.get_age()
super(Employee, self).save(*args, **kwargs)
我的員工/serializers.py現在:
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = ['id', 'name', 'email', 'departament', 'salary', 'birth_date', 'age']
為了以防萬一,我已經運行了makemigrationsandmigrate命令。manager.py
但是我現在在嘗試創建新員工時遇到了這個錯誤:
'datetime.date' object has no attribute 'days'
怎么了?
uj5u.com熱心網友回復:
主意
不需要額外的欄位來存盤計算值,因為它們是根據資料庫中的行計算的。
- 首先,您通過使用聚合方法找到
min_salary、max_salary和。avg_salary - 使用 found
min_salary和max_salary查找員工。 - 實作一個序列化器類,用于序列化
highest、lowest和average員工工資報告。 - 使用已實作的序列化程式類對
lowest、highest和avarage進行序列化。
代碼
在我看來,執行邏輯的代碼應該在另一層,通常稱為服務層。
# employees/services.py
class EmployeeSalaryReport:
def __init__(self, lowest, highest, average):
self.lowest = lowest
self.highest = highest
self.average = average
def get_employee_salary_report():
salary_report_dict = Employee.objects.aggregate(
min_salary=Min("salary"),
max_salary=Max("salary"),
avg_salary=Avg("salary"),
)
lowest_salary_employee = Employee.objects.filter(
salary=salary_report_dict.get("min_salary")
).first()
highest_salary_employee = Employee.objects.filter(
salary=salary_report_dict.get("max_salary")
).first()
return EmployeeSalaryReport(
lowest=lowest_salary_employee,
highest=highest_salary_employee,
average=salary_report_dict.get("avg_salary"),
)
# employees/serializers.py
class EmployeeSalaryReportSerializer(serializers.Serializer):
lowest = EmployeeSerializer()
highest = EmployeeSerializer()
average = serializers.FloatField()
# employees/views.py
from rest_framework import views
from rest_framework.response import Response
from employees.services import get_employee_salary_report
from employees.serializers import EmployeeSalaryReportSerializer
class ReportSalaryView(views.APIView):
def get(self, request, *args, **kwargs):
employee_salary_report = get_employee_salary_report()
serializer = EmployeeSalaryReportSerializer(employee_salary_report)
return Response(serializer.data)
# employees/urls.py
from django.urls import path
from employees.views import ReportSalaryView
urlpatterns = [
... # other paths
path("reports/employees/salary/", ReportSalaryView.as_view(), name="report-salary"),
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476768.html
