django - 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 为我生成主键。
更新
- 授权不是问题。我正在使用令牌授权并提出请求可以正常流畅地工作。
- 我在本地开发中使用 sqlite3,我的原始数据库是从 .csv 文件创建的。现在,当我使用来自 vue3 的发布请求创建新实例时,django 总是给出一个值为“null”的主 id 字段。这可能是我忘记提及的重要事情。
- 我尝试在发布请求中携带 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 模型 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)
推荐阅读
- ruby - 如何在没有反斜杠转义的情况下在 Ruby 中执行字符串替换
- c# - 在 C# 控制台应用程序中下载将部署为 Azure WebJob 的文件
- go - Golang toString 用于接口和结构实现
- javascript - 在 Javascript/HTML 中将 Firebase 数据显示为数组
- opencl - 如何在 OpenCL 中使用 __local 变量?
- python - 检查子字符串匹配并创建新列表
- android - 如何使用基本适配器为网格视图项制作上下文菜单?
- python - 在 python 类中实现更改业务逻辑
- python - 理解 numpy 数组切片的问题
- lua - 是否有执行脚本的函数?