Django Rest Framework -在后端覆盖保存不会创建自定义id

8ehkhllq  于 2022-12-14  发布在  Go
关注(0)|答案(3)|浏览(129)

我正在做一个项目。我有Django作为我的后端和Vue作为我的前端。当使用模板和保存在Django项目中时,我没有问题。
然而,当我POST到我的项目API时,没有创建以下来自我的模态的保存。

型号.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请求以获取项目的ID。

序列化程序.py

class DevProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = DevProjects
        fields = ("project_id", "project_title", "project_desc", "project_category", "project_status")

查看次数.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

**当从DRF POST时,我需要为project_id生成什么?**感谢任何帮助。
更新

我可以尝试在视图集中使用以下代码:

def create(self, *args, **kwargs):
        self.project_id = 'PROJ-' + str(self.id)
        super(DevProjectViewSet, self).save(**kwargs)

但是,我得到了以下错误:

self.project_id = 'PROJ-' + str(self.id)
AttributeError: 'DevProjectViewSet' object has no attribute 'id'

我真的很纠结于如何处理API发布请求。

u0njafvf

u0njafvf1#

据我所知,您可以放松对project_id的唯一性约束,之前的代码应该可以正常工作。
由于项目代码是不可编辑的,因此它不会从POST API调用中更新。

uajslkp6

uajslkp62#

我能够通过在www.example.com中编写一个简单的函数来解决所有这些问题utils.py,该函数获取创建的最新ID,加1,然后设置新的project_id

qhhrdooz

qhhrdooz3#

尝试使用此代码片段

def save(self, *args, **kwargs)
    self.project_id = 'PROJ-' + str(self.id)
    super(DevProjects, self).save(**kwargs)

相关问题