首页 > 解决方案 > Django DRF在axios post方法之后使用主键“id:null”创建新对象

问题描述

概括

我使用 django 和 django rest 框架作为后端,使用 vue3 作为前端来构建网站。我还使用 axios 将数据发布到后端,它工作正常,除了在后端创建的每个对象都有一个主键“id:null”而不是自动递增 id 字段。

编号:空

细节

我知道 django 会自动为你创建自增主键,所以我没有在我的 models.py 中声明这个字段。它之所以有效,是因为我可以在从后端读取数据时获取主键 ID 并将其显示在前端。

所以我想我可以在没有 id 字段的情况下发布数据,让 django 为这个新实例提供一个自动递增的 id 字段。但是,每次创建对象并且每次“id:null”。

这是我的模型序列化程序:

class MaterialSerializer(serializers.ModelSerializer):
    class Meta:
        model = Material
        fields = "__all__"

以下是接收请求的对象列表视图代码:

class MaterialList(generics.ListCreateAPIView):
    queryset = Material.objects.all()
    serializer_class = MaterialSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

这是我使用 axios 从 vue3 发出的帖子请求:

    const addNewMaterial = (payload) => {
      axios.post(store.state.backendAPIs.coreAPI, payload.data)
        .then(_ => console.log('...'))
          .catch(err => {
            window.alert('...')
            console.log(err)
      })
}

我该如何解决这个问题,或者我只需要另一种方法,而不是让 django 为我生成主键。

更新

这是我的models.py:

class Material(models.Model):
    series = CharField(db_column="series ", verbose_name="series ", max_length=100)
    mark = CharField(db_column="mark", verbose_name="mark", max_length=100)
    manufacturer = CharField(db_column="manufacturer", verbose_name="manufacturer",  max_length=50)
    link = CharField(db_column="...", verbose_name="...", max_length=100)
    acronym = CharField(db_column="...", verbose_name="...", max_length=20)

    class Meta:
        db_table = "test"

标签: djangodjango-rest-frameworkbackendvuejs3

解决方案


就我而言,我没有在 django 模型 save() 方法中返回 super()

def save(self, *args, **kwargs):
    if not self.created:
        self.pack_start = datetime.datetime.now()
        self.package = self.employer_status.package.free_job_advertise
    if not self.created:
        self.pack_end = datetime.datetime.now() + 
        datetime.timedelta(days=self.package.validity_period)
    return super(EmployerFreeJobAdvertiseStatus, self).save(*args, **kwargs)

推荐阅读