django - Django REST 框架:使用 URL 中的 ID 发布到 URL
问题描述
给定以下人为的示例,我如何POST
使用路径中的 ID 访问 URL 并让它解析模型实例,而不是将模型实例包含在POST
主体本身中?
网址.py
path("api/schools/<int:pk>/student/", views.CreateStudentView.as_view(), name="createStudent")
模型.py
class School(models.Model):
name = models.CharField(default="", max_length=128)
address = models.CharField(default="", max_length=128)
mascot = models.CharField(default="", max_length=128)
class StudentModel(models.Model):
first_name = models.CharField(default="", max_length=128)
last_name = models.CharField(default="", max_length=128)
notes = models.CharField(default="", max_length=512)
school = models.ForeignKey(School, on_delete=models.CASCADE)
序列化程序.py
class CreateStudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ("first_name", "last_name")
视图.py
class CreateStudentView(generics.CreateAPIView):
serializer_class = CreateStudentSerializer
queryset = Student.objects.all()
我希望能够POST
只将新学生的名字和姓氏添加到 URL 中,以便在我的数据库中创建一个新学生。但是,因为我没有School
在我的正文中提供一个对象,所以POST
我得到了一个错误。我希望我的代码能够解析我想将学生添加到哪所学校,因为 URL 包含 ID。
当我POST
跟随正文到/api/schools/1/student/
. ID 为 1 的学校确实存在于数据库中。
{
"first_name": "John",
"last_name": "Smith"
}
IntegrityError at /api/schools/1/student/
NOT NULL constraint failed: students_school.school_id
解决方案
最简单的方法是覆盖您的CreateStudentView
. URL 参数存储在 中self.kwargs
,因此您可以从那里检索它,并将其注入到您的序列化程序中:
class CreateStudentView(generics.CreateAPIView):
serializer_class = CreateStudentSerializer
queryset = Student.objects.all()
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs["context"] = self.get_serializer_context()
# Check if a pk was passed through the url.
if 'pk' in self.kwargs:
modified_data = self.request.data.copy()
modified_data['school'] = self.kwargs.get('pk')
kwargs["data"] = modified_data
return serializer_class(*args, **kwargs)
# If not mind, move on.
return serializer_class(*args, **kwargs)
这篇文章的学分,您可以在其中阅读有关其工作原理的更多信息。
推荐阅读
- c - 如何编写一个C程序来删除单链表中负元素之前的所有节点?
- sparql - 如何使用 SPARQL 查询获取 IRI 之间或某些 rdf:type 的两个节点之间的路径?
- python - 如何遍历唯一 ID 并计算日期值之间的差异并将值写入新列
- swiftui - SwiftUI 未知属性“可观察对象”
- javascript - 如何在 javascript 中重新分配 else if 以使其功能相同但键入为 elif?
- android - 通过网络请求回填时从 Room 发出协程流
- gnome-builder - 使用 Gnome-Builder 自动完成 Python 代码
- macos - 如何使用 ffmpeg 将多个 glob 输入加入时间间隔?
- terminal - 当我尝试运行“xcrun usdz_convert”时出现错误
- python - 将数组扩展到 dask 数据框中的列