(Отношение "многие к одному") не пересылаются вложенные поля дочернего объекта при создании родительского объекта
Я создаю объект Project, с дочерним объектом milestone в качестве поля project, используя ForeignKey и вложенные сериализаторы.
сначала я написал тест для создания вехи (вех) при создании нового проекта :
PROJECTS_URL = reverse('project:project-list')
def test_create_project_with_new_milestones(self):
"""Test creating project with milestones"""
payload = {
'title': 'Test',
'time_hours': 10,
'milestones': [
{
'title': 'FirstMilestone',
'hierarchycal_order': 1,
'order': 1
},
{
'title': 'FirstMilestoneSub',
'hierarchycal_order': 1,
'order': 2
},
{
'title': 'SecondMilestone',
'hierarchycal_order': 2,
'order': 1
},
],
}
res = self.client.post(PROJECTS_URL, payload, format='json')
""" ... + rest of the test ..."""
Затем обновил serializers.py, добавив функцию для создания вех и обновив функцию create, добавив создание вех аналогично тому, как я сделал для тегов (работает для тегов, но теги - это корабль отношений "многие ко многим" и имеет только поле имени):
class ProjectSerializer(serializers.ModelSerializer):
"""Serializer for projects"""
tags = TagSerializer(many=True, required=False)
milestones = MilestoneSerializer(many=True, required=False)
class Meta:
model = Project
fields = ['id', 'title', 'time_hours', 'link', 'tags', 'milestones']
read_only_fields = ['id']
...
def _create_milestones(self, milestones, project):
"""Handle creating milestones as needed."""
auth_user = self.context['request'].user
for milestone in milestones:
milestone_obj, created = Milestone.objects.create(
user=auth_user,
project=project,
**milestone,
)
project.milestones.add(milestone_obj)
def create(self, validated_data):
"""Create a project."""
tags = validated_data.pop('tags', [])
milestones = validated_data.pop('milestones', [])
project = Project.objects.create(**validated_data)
self._get_or_create_tags(tags, project)
self._create_milestones(milestones, project)
return project
...
Модели, которые я успешно протестировал при создании:
...
class Project(models.Model):
"""Project object."""
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
title = models.CharField(max_length=255)
description = models.TextField(blank=True)
time_hours = models.IntegerField()
link = models.CharField(max_length=255, blank=True)
tags = models.ManyToManyField('Tag')
def __str__(self):
return self.title
class Milestone(models.Model):
"""Create sections for project"""
title = models.CharField(max_length=255)
description = models.TextField()
hierarchycal_order = models.IntegerField()
order = models.IntegerField()
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
parent = models.ForeignKey(
'self', on_delete=models.CASCADE,
related_name='child',
null=True
)
project = models.ForeignKey(
'Project',
on_delete=models.CASCADE,
related_name='milestones'
)
и представление для объекта проекта :
class ProjectViewSet(viewsets.ModelViewSet):
"""View for manage Project APIs."""
serializer_class = serializers.ProjectDetailSerializer
queryset = Project.objects.all()
authentication_classes = \[TokenAuthentication\]
permission_classes = \[IsAuthenticated\]
def get_queryset(self):
""" Retrieve projects for authenticated user."""
return self.queryset.filter(user=self.request.user).order_by('-id')
def get_serialize_class(self):
"""Retuurn the serializer class for requests."""
if self.action == 'list':
return serializers.ProjectSerializer
return self.serializer_class
def perform_create(self, serializer):
""" Create a new project."""
serializer.save(user=self.request.user)
Тест вернул :
django.db.utils.IntegrityError: null value in column "hierarchycal_order" of relation "core_milestone" violates not-null constraint
DETAIL: Failing row contains (2, , , null, null, null, 6, 19).
поэтому я думаю, что в validated_data не содержатся поля вех.
Я начинающий, поэтому буду признателен за вашу снисходительность к формулировке и уровню моего английского языка.