【问题标题】:Django DRF create new object with primary key "id: null" after axios post methodDjango DRF在axios post方法之后使用主键“id:null”创建新对象
【发布时间】:2021-04-05 01:50:40
【问题描述】:

总结

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

id: null

详情

我知道 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 为我生成主键。

更新

  • 授权不是问题。我正在使用令牌授权并提出请求工作正常且流畅。
  • 我在本地开发中使用 sqlite3,我的原始数据库是从 .csv 文件创建的。现在,当我使用来自 vue3 的发布请求创建新实例时,django 总是给出一个值为“null”的主 id 字段。这可能是我忘记提及的重要事情。
  • 我尝试在 post 请求中携带 id 字段,但它不起作用。无论您从前端发布什么 id 值,该对象始终具有“id:null”。 (在 post 请求中未携带 id 字段时也为“id: null”)
  • 创建的对象包含除“id: null”之外的所有字段和有效值,因此我无法使用主键找到那些新创建的对象,这让我很头疼。

这是我的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"

【问题讨论】:

  • 你使用的是什么数据库后端?
  • 请分享型号代码

标签: django django-rest-framework backend vuejs3


【解决方案1】:

我认为您在进行 axios.post 调用时缺少 Authorization 标头。 IsAuthenticatedOrReadOnly 在进行 POST 调用时需要 Authorization 标头。

【讨论】:

    【解决方案2】:

    在我的情况下,我没有在 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)
    

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多