Django остальные рамки: вложенные сериализаторы правильный способ обновления? - PullRequest
0 голосов
/ 16 апреля 2019

Я довольно новичок в django и django rest framework ... Я все еще учусь, так что извините, если я задаю глупый вопрос ... Извините заранее ...

Это сказал!

Вот модели, над которыми я работаю:

class Targets(models.Model):
    first_name = models.TextField()
    last_name = models.TextField()
    email = models.TextField()
    position = models.TextField()

class Groups(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_id')
    name = models.TextField(unique=True, null=False)
    modified_date = models.DateTimeField(auto_now_add=True)
    targets = models.ManyToManyField(Targets)

Группы расширяет основные пользовательские модели Таким образом, пользователь может иметь несколько групп. Группы имеют несколько целей Цели могут быть частью нескольких групп

Вот конечные точки:

urlpatterns = [
    path('groups/', GroupsAPIView.as_view()),
    path('groups/<int:pk>/', GroupsIDAPIView.as_view())
]

Вот сериализаторы:

class GroupsIDSerializer(serializers.ModelSerializer):
    targets = TargetsSerializer(many=True)
    class Meta:
        model = Groups
        fields = ('id', 'name', 'modified_date', 'user_id', 'targets', )

    def update(self, instance, validated_data):
        targets = validated_data.pop('targets')
        group = Groups.objects.filter(id=instance.id).first()
        Groups.objects.filter(id=instance.id).update(**validated_data)
        group.targets.clear()
        for target in targets:
            obj, created = Targets.objects.get_or_create(**target)
            group.targets.add(obj)
        return Groups.objects.filter(id=instance.id)

class TargetsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Targets
        fields = ('id', 'first_name', 'last_name', 'email', 'position', )

Вот мнения:

class GroupsIDAPIView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Groups.objects.all()
    serializer_class = groups.GroupsIDSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_queryset(self):
        queryset = super(GroupsIDAPIView, self).get_queryset()
        queryset = queryset.filter(user=self.request.user)
        return queryset

Вот поведение API, который я хочу построить:

PUT (url/groups/<int:pk>): Modify the specific group with all the targets for the connected user

{
    "name":"changed",
    "targets":[
        {
            "first_name": "changed",
            "last_name": "a",
            "email": "a@a.fr",
            "position":"a"
        }
    ]
}

Response =>
{
    "id": 1,
    "name": "changed",
    "modified_date": "new date",
    "user_id": 1,
    "targets": [
        {
            "id": 1,
            "first_name": "changed",
            "last_name": "a",
            "email": "a@a.fr",
            "position": "a"
        }
    ]
}

Со всем, что я сказал ... Вот вопросы:

1) У меня все еще есть проблемы с PUT (url/groups/<int:pk>). Который все еще не работает ... Не знаю, как обновить только цели этой группы. Я получил следующую ошибку: Got AttributeError when attempting to get a value for field 'name' on serializer 'GroupsIDSerializer'.

2) Правильный способ обработки ошибок и отката? Я думаю, что решение заключается в использовании атомарных транзакций? Но я не уверен ? Если вы готовы привести пример, я буду благодарен ...

3) Я не уверен, что то, что я делаю, на самом деле правильно ... Я хочу получить какие-либо отзывы обо всем этом. Поскольку остальная часть проекта довольно похожа.

4) Еще раз спасибо!

С уважением,

...