【发布时间】:2021-04-05 01:50:40
【问题描述】:
总结
我使用 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 字段。这可能是我忘记提及的重要事情。
- 我尝试在 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