Сохранить модель «многие ко многим» в Django / REST?
Я пишу REST API для моего приложения Django и не могу заставить запросы POST работать на одной модели. Вот модель, о которой идет речь:
class ProjectNode(models.Model):
name = models.CharField(max_length=60)
place = models.CharField(max_length=150)
time_spent = models.BigIntegerField()
parent_project = models.ForeignKey(Project, related_name='tasks')
workers = models.ManyToManyField(User, related_name='tasks_can_do')
def __str__(self):
return self.name
User
модель просто держитname
поле в данный момент. Вот мой сериализатор дляProjectNode
:
class ProjectNodeSerializer(serializers.ModelSerializer):
class Meta:
model = ProjectNode
fields = ('id', 'name', 'place', 'time_spent', 'workers',)
И вот представление API (отviews.py
):
class WebProjectNodeListView(generics.ListCreateAPIView):
queryset = ProjectNode.objects.all()
serializer_class = ProjectNodeSerializer
def pre_save(self, obj):
obj.parent_project = Project.objects.get(pk=self.request.DATA['parent_project'])
for worker_pk in self.request.DATA['workers']:
obj.workers.add(User.objects.get(pk=worker_pk))
obj.final_worker = User.objects.get(pk=self.request.DATA['final_workers'])
Вчера я сначала попробовал более простую версию, которая имела толькоProject
ForeignKey отношения, и это, кажется, работает, поэтому я думал, что с помощьюadd
будет работать, но я получаю сообщение об ошибке при тестировании API сhttpie
(Я уже добавил некоторых пользователей и проекты, и я уверен, что я получаю их идентификаторы правильно). Вот запрос:
http POST :8000/api/tasks/ name="newtask" place="home" time_spent:=50 parent_project:=1 workers:=[1]
И я получаю эту ошибку:
"<ProjectNode: newtask>" needs to have a value for field "projectnode" before this many-to-many relationship can be used.
И трассировка также указывает на эту строку кода:
obj.workers.add(User.objects.get(id=worker_pk))
Теперь я чувствую, что это потому, что я пытаюсь обновить отношения наUser
объект передProjectNode
объект создан в базе данных, но я не уверен, как решить эту проблему?