Как обрабатывать отношения внешних ключей в 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".