如何处理 django-rest-framework 中 url 模式中的外键关系
Posted
技术标签:
【中文标题】如何处理 django-rest-framework 中 url 模式中的外键关系【英文标题】:How do I handle foreign key relationship in the urlpattern in the django-rest-framwork 【发布时间】:2022-01-01 20:08:15 【问题描述】:在我的 models.py 我有以下类:
class Project(models.Model):
name = models.CharField(max_length=100)
class ProjectMaterial(models.Model):
project = models.ForeignKey("Project", on_delete=models.CASCADE)
material = models.CharField(max_length=150)
units = models.IntegerField()
我的序列化器是这样的:
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = "__all__"
class ProjectMaterialSerializer(serializers.ModelSerializer):
class Meta:
model = ProjectMaterial
fields = "__all__"
我当前的 views.py 如下所示:
class ProjectList(generics.ListCreateAPIView):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
class ProjectMaterialList(generics.ListCreateAPIView):
queryset = ProjectMaterial.objects.all()
serializer_class = ProjectMaterialSerializer
我应该如何创建我的 urlpatterns 来发出 PUT 请求来更改 units 值 对于 id=3 的材质,id=1 的项目?
【问题讨论】:
【参考方案1】:我想您想更改 id = 3 的材质对象的值。在这种情况下,您真的不想将 FK 添加到 url_patterns。相反,您可以通过 PUT 请求发送与 FK 相关的数据数据。
urlpatterns = [
path('<id>/edit/', MaterialUpdateView.as_view(), name='material-update'),
]
如果你真的想改变 FK。通过这样的 PUT 或 PATCH 请求发送数据
data =
id: 3,
project: 1,
material: "some material"
units: 25,
【讨论】:
【参考方案2】:如果您想更新 id=3 的“ProjectMaterial”记录,并且该记录与 id=1 的“Project”记录具有 FK 关系。您需要的只是 URL 中的“ProjectMaterial”id 以及需要为相应的“Project”记录更新的数据(因为它与 ProjectMaterial 有关系)。
urlpatterns = [
path('/material/<id>/', ProjectMaterialDetail.as_View(), name='project_material')
]
如果您只想更新“ProjectMaterial”的“units”字段,只需将UpdateModelMixin 继承到新的视图类“ProjectMaterialDetail”中即可。您可以将“RetrieveModelMixin”继承到同一个类中。您需要做的就是确保在“ProjectMaterialDetail”视图的“PUT”方法中以正确的格式向 ProjectMaterial 序列化程序发送数据。
id: 5,
units: 152,
您可以在序列化程序中覆盖更新方法,也可以在“PUT”方法中调用“partial_update”方法。
【讨论】:
以上是关于如何处理 django-rest-framework 中 url 模式中的外键关系的主要内容,如果未能解决你的问题,请参考以下文章