我在 Django 文档或源代码中找不到在主键字段上设置
serialize=False
的原因。有什么特殊原因要设置吗?
谢谢
Azd325,
就像听起来一样简单,该字段不会成为序列化对象的一部分..
尽管如此,我猜您的问题与正在迁移的模型有关,并且生成的 ID 为 serialize=False,对吧?例如here..实际上没有关于此的文档,因为这是Django的引擎技巧来创建一个内在ID,因为你决定不为你的对象声明一个显式ID..
我刚刚做了一些测试的补充
创建没有显式 ID 的模型
class Model1Test(models.Model):
justafield = models.CharField(max_length=1000)
迁移结果
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Model1Test',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('justafield', models.CharField(max_length=1000)),
],
),
]
数据库级脚本
CREATE TABLE public.module1_model1test
(
id integer NOT NULL DEFAULT nextval('module1_model1test_id_seq'::regclass),
justafield character varying(1000) NOT NULL,
CONSTRAINT module1_model1test_pkey PRIMARY KEY (id)
)
来自 Quassnoi 的一些很好的理由:
这个问题也困扰着我。我找不到任何可以回答“为什么”问题的文档,但经过思考之后,我就找到了答案。
当您序列化一个对象时,您正在“输出”您的信息。经常通过网络,或者可能是同一服务器上的另一个“消耗程序”。
如果主键是由 Django 自动生成的,那么它并不是真正的“信息”。它有助于在 Django 中组织(读、写)数据。序列化它并将其发送到不同的系统没有任何好处(可能有自己的除主键之外的数据组织方式,或者可以简单地创建自己的主键而不会丢失原始数据的任何值)。
我尝试创建自己的主键并告诉 Django 我想要序列化它。但 Django 总是覆盖我并使用
serialize=False
我不完全确定 Django 为何这么做,但至少这是我无法做出的决定。
PS:我可以想到一种场景,我希望序列化我的主键。如果它是另一个表中的外键。但这确实是一个假设,我实际上还没有遇到过这个用例。