@Antigo_ptz

Django Rest Framework, как сохранить несколько сущностей в одном запросе?

Всем привет!
Мне необходимо реализовать сохранение DirectoryItem по следующему алгоритму:
1 при добавлении DirectoryItem я ищу сначала ее в БД по ключу directory+is_active+code.
2 Если запись не найдена - то я создаю новую запись.
3 Если такая запись найдена, то я сравниваю передаваемые значения name и short_name со значениями в найденной записи.
4 Если name и short_name такие же, какие передаю я - то выкидываю exception (т.к. точно такая же запись уже существует)
5 Если name и short_name отличаются от передаваемых, то я деактивирую старую запись (is_active=False) и добавляю новую запись в таблицу.

Проблема в том, что когда я деактивирую старую запись в шаге 5 и пытаюсь создать новую запись, то выпадает ошибка "You cannot call `.save()` after accessing `serializer.data`.If you need to access data before committing to the database then inspect 'serializer.validated_data' instead." Кто-то может подсказать, как мне решить данную проблему?

models.py
class DirectoryItem(models.Model):
    id = models.BigAutoField(primary_key=True)
    code = models.CharField(max_length=125)
    name = models.CharField(max_length=255)
    short_name = models.CharField(max_length=255)
    created_date = models.DateField(auto_now_add=True)
    last_modified_date = models.DateField(auto_now=True)
    last_modified_user = models.CharField(max_length=125, blank=True)
    directory = models.ForeignKey(
        Directory,
        models.PROTECT,
        verbose_name='directory',
    )
    is_active = models.BooleanField(default=False)


views.py
class DirectoryItemListCreateView(DirectoryItemMixin, generics.ListCreateAPIView):
    def create(self, request, *args, **kwargs):
        directoryId = request.data['directory']
        isActive = request.data['is_active']
        code = request.data['code']
        directoryItems = DirectoryItem.objects.filter(directory=directoryId, is_active=isActive, code=code)
        if directoryItems.count() != 0:
            item = directoryItems[0]
            if item.name == request.data['name'] and item.short_name == request.data['short_name']:
                raise EntityExistException()
            else:
                item.is_active = False
                item.save()
                return super().create(request, *args, **kwargs)
        else:
            return super().create(request, *args, **kwargs)
  • Вопрос задан
  • 955 просмотров
Решения вопроса 1
@Antigo_ptz Автор вопроса
Попробовал через сериалайзер - вроде все работает

class DirectoryItemSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        directoryId = validated_data['directory'].id
        isActive = True
        code = validated_data['code']
        directoryItems = DirectoryItem.objects.filter(directory=directoryId, is_active=isActive, code=code)
        if directoryItems.count() != 0:
            item = directoryItems[0]
            if item.name == validated_data['name'] and item.short_name == validated_data['short_name']:
                raise EntityExistException()
            else:
                item.is_active = False
                item.save()
                return DirectoryItem.objects.create(**validated_data)
        else:
            return DirectoryItem.objects.create(**validated_data)

    class Meta:
        model = DirectoryItem
        fields = '__all__'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы