如何处理 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 模式中的外键关系的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码

Akka 如何处理消息版本?

开玩笑测试 - 如何处理 JsonWebToken 响应

如何处理 JSON 响应

“不知道如何处理' nvcc 致命错误