Я довольно новичок в 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) Еще раз спасибо!
С уважением,