迁移文件中 Django 的“primary_key”字段中的“serialize=False”是什么意思?

问题描述 投票:0回答:2

我在 Django 文档或源代码中找不到在主键字段上设置

serialize=False
的原因。有什么特殊原因要设置吗?

谢谢

python django django-models django-migrations
2个回答
9
投票

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 的一些很好的理由:

  1. 你需要你的桌子可以加入某些东西
  2. 如果你希望你的表是集群的,你需要某种主键
  3. 如果您的表设计不需要主键,请重新考虑您的设计:很可能您遗漏了一些东西。为什么要保留相同的记录?

1
投票

这个问题也困扰着我。我找不到任何可以回答“为什么”问题的文档,但经过思考之后,我就找到了答案。

当您序列化一个对象时,您正在“输出”您的信息。经常通过网络,或者可能是同一服务器上的另一个“消耗程序”。

如果主键是由 Django 自动生成的,那么它并不是真正的“信息”。它有助于在 Django 中组织(读、写)数据。序列化它并将其发送到不同的系统没有任何好处(可能有自己的除主键之外的数据组织方式,或者可以简单地创建自己的主键而不会丢失原始数据的任何值)。

我尝试创建自己的主键并告诉 Django 我想要序列化它。但 Django 总是覆盖我并使用

serialize=False

我不完全确定 Django 为何这么做,但至少这是我无法做出的决定。

PS:我可以想到一种场景,我希望序列化我的主键。如果它是另一个表中的外键。但这确实是一个假设,我实际上还没有遇到过这个用例。

© www.soinside.com 2019 - 2024. All rights reserved.