|
|
❯ 试解释下面语句中: migrations.CreateModel(
name='Profile',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('app_id', models.CharField(max_length=20)),
('secret_key', models.CharField(max_length=20)),
('credit_point', models.PositiveIntegerField(default=1000)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
), ‘user'这一行。user从哪里来的,OneToOneField 又是什么,我如果要保存用户名,保存在哪个field?
● user 字段解释
user 从哪里来
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
settings.AUTH_USER_MODEL 指向 Django 内置的 User 模型(django.contrib.auth.models.User)。这是 Django
自带的用户表,包含字段:username、password、email、date_joined 等。
Profile 是���目自定义的扩展表,user 字段是一根"连线",把 Profile 和内置 User 绑定在一起。
---
OneToOneField 是什么
一对一关系——每个 User 只能对应一个 Profile,每个 Profile 也只能对应一个 User。
auth_user 表 mysite_profile 表
────────────── ───────────────────────────
id=1 simon ◄───── user_id=1 app_id=xxx secret_key=yyy
id=2 alice ◄───── user_id=2 app_id=zzz secret_key=www
on_delete=CASCADE 的意思是:如果 User 被删除,对应的 Profile 也自动删除。
---
想保存用户名,用哪个 field?
不需要在 Profile 里再存一份 username,直接通过关联访问即可:
profile = Profile.objects.get(user=request.user)
profile.user.username # 用户名
profile.user.email # 邮箱
profile.app_id # Profile 自己的字段
username 已经存在 auth_user 表的 User 里,Profile.user 这根线让你随时能取到它。在 Profile 里重复存 username 反而会导致数据不一致。 |
|