Всем привет!
Мне необходимо реализовать сохранение 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)