Django DRF使用主键“创建新对象”;id:null";后轴柱法

Django DRF使用主键“创建新对象”;id:null";后轴柱法,django,django-rest-framework,backend,vuejs3,Django,Django Rest Framework,Backend,Vuejs3,摘要 我使用django和django rest框架作为后端,vue3作为前端来构建一个网站。我还使用axios将数据发布到后端,除了在后端创建的每个对象都有一个主键“id:null”而不是自动递增的id字段外,它工作正常 细节 我知道django会自动为您创建自动递增主键,所以我没有在models.py中声明此字段。它之所以有效,是因为我可以获取主键id,并在从后端读取数据时在前端显示它 因此,我认为我可以在没有id字段的情况下发布数据,并让django为这个新实例提供一个自动递增的id字段

摘要

我使用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发出的post请求:

    const addNewMaterial = (payload) => {
      axios.post(store.state.backendAPIs.coreAPI, payload.data)
        .then(_ => console.log('...'))
          .catch(err => {
            window.alert('...')
            console.log(err)
      })
}
我如何解决这个问题,或者我只需要另一种方法,而不是让django为我生成主键

更新

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

我认为您在进行axios.post调用时缺少授权标头
IsAuthenticationDorReadOnly
在进行POST调用时需要一个
授权
头。

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