Django Rest Framework - при переопределении сохранения в бэкенде не создается пользовательский id
Я работаю над проектом. У меня есть Django для бэкенда и Vue для фронтэнда. При использовании шаблонов и сохранении в проекте Django у меня нет проблем.
Однако, когда я POST к API моих проектов, следующее сохранение из моего модала не создается.
models.py
class DevProjects(models.Model):
PROJECT_TYPE = [
('New Application', 'New Application'),
('Update Application', 'Update Application'),
('Bug Fixes', 'Bug Fixes')
]
PROJECT_STATUS = [
('New', 'New'),
('In Progress', 'In Progress'),
('Complete', 'Complete'),
]
project_id = models.CharField(max_length=15, editable=False, unique=True)
project_title = models.CharField(max_length=100)
project_desc = models.CharField(max_length=500)
project_category = models.CharField(max_length=25, choices=PROJECT_TYPE, null=True, blank=True)
project_status = models.CharField(max_length=25, choices=PROJECT_STATUS, default='New')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
created_by = models.ForeignKey(User, related_name='projects', on_delete=models.CASCADE)
def save(self, *args, **kwargs):
super(DevProjects, self).save(**kwargs)
self.project_id = 'PROJ-' + str(self.id)
super(DevProjects, self).save(**kwargs)
def __str__(self):
return self.project_title
У меня есть project_id
, создаваемый при сохранении, который получает исходный ID, но просто добавляет 'PROJ-' перед ним. Когда я отправляю форму с фронтенда, это определение сохранения не вызывается, таким образом не создается project_id
.
ID проекта - это то, что я использую для отправки GET-запроса, чтобы получить проекты.
serailizer.py
class DevProjectSerializer(serializers.ModelSerializer):
class Meta:
model = DevProjects
fields = ("project_id", "project_title", "project_desc", "project_category", "project_status")
views.py
class DevProjectViewSet(viewsets.ModelViewSet):
serializer_class = DevProjectSerializer
queryset = DevProjects.objects.all()
def perform_create(self, serializer):
serializer.save(created_by=self.request.user)
Когда я отправляю сообщение, я получаю следующую ошибку:
IntegrityError: UNIQUE constraint failed: ckcSupportWeb_devprojects.project_id
Что мне нужно сделать, чтобы project_id
генерировался при постинге из DRF? Любая помощь будет принята с благодарностью.
Насколько я понимаю, вы можете ослабить ограничение уникальности на project_id
и ваш предыдущий код будет работать нормально.
Поскольку код проекта не редактируется, он не будет обновлен при вызове POST API.
Я смог избавиться от всех этих проблем, написав простую функцию в utils.py, которая получает последний созданный ID, добавляет 1 и затем устанавливает новый project_id
.
Попробуйте с этим фрагментом кода
def save(self, *args, **kwargs)
self.project_id = 'PROJ-' + str(self.id)
super(DevProjects, self).save(**kwargs)