Как обрабатывать отношения внешних ключей в urlpattern в django-rest-framwork

В моем 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

Как мне создать мои url-шаблоны, чтобы сделать PUT запрос для изменения значения units для проекта с id=1 для материала с id=3? проекта с id=1 для материала с id=3?

Предположим, вы хотите изменить значение объекта Material Object, где id = 3. В этом случае вы действительно не хотите добавлять FK в url_patterns. Вместо этого вы можете отправить данные, связанные с FK, через запрос PUT.

urlpatterns = [
    path('<id>/edit/', MaterialUpdateView.as_view(), name='material-update'),
]

Если вы действительно хотите изменить FK. отправьте данные через запрос PUT или PATCH следующим образом

  data = {
      id: 3,
      project: 1,
      material: "some material"
      units: 25,
   }

Если вы хотите обновить запись "ProjectMaterial" с id=3, которая имеет FK отношение к записи "Project" с id=1. Все, что вам нужно, это идентификатор "ProjectMaterial" в URL и данные, которые необходимо обновить для соответствующей записи "Project" (поскольку она находится в отношениях с ProjectMaterial).

urlpatterns = [
path('/material/<id>/', ProjectMaterialDetail.as_View(), name='project_material')

]

Если вы хотите обновить только поле "units" в "ProjectMaterial", вы просто наследуете UpdateModelMixin в новом классе представления, "ProjectMaterialDetail". Вы можете наследовать "RetrieveModelMixin" в том же классе. Все, что вам нужно сделать, это убедиться, что вы отправляете данные в правильном формате сериализатору ProjectMaterial в методе "PUT" представления "ProjectMaterialDetail"

{
    id: 5,
    units: 152,
}

Вы можете переопределить метод Update в сериализаторе или вызвать метод "partial_update" в методе "PUT".

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