(Отношение "многие к одному") не пересылаются вложенные поля дочернего объекта при создании родительского объекта

Я создаю объект 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 не содержатся поля вех.

Я начинающий, поэтому буду признателен за вашу снисходительность к формулировке и уровню моего английского языка.

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