Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1|回复: 1

Django 中的user模块

[复制链接]

488

主题

669

帖子

3945

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3945
发表于 6 小时前 | 显示全部楼层 |阅读模式
❯ 试解释下面语句中:        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 反而会导致数据不一致。
回复

使用道具 举报

488

主题

669

帖子

3945

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3945
 楼主| 发表于 6 小时前 | 显示全部楼层
❯ profile = Profile.objects.get(user=request.user)

  profile.user.username   # 用户名    这个用户名字段是什么类型的?默认允许长度是多少?

  Searched for 1 pattern (ctrl+o to expand)

● 项目代码里没有定义,这是 Django 内置的。直接看 Django 源码定义:

  django/contrib/auth/models.py 中 AbstractUser:

  username = models.CharField(
      max_length=150,
      unique=True,
      ...
  )

  ┌────────────┬────────────────────┐
  │           属性          │                     值                     │
  ├────────────┼────────────────────┤
  │ 类型                    │ CharField                               │
  ├────────────┼────────────────────┤
  │ max_length          │ 150                                       │
  ├────────────┼────────────────────┤
  │ unique                 │ True(不允许重名)               │
  └────────────┴────────────────────┘

  ---
  注意对比: 本项目 forms.py:10 的登录表单里 username ���的是 max_length=100,比数据库的 150 更严格——所以登录时表单会先在前端/Python 层拦截超过 100
  字符的输入,但数据库层本身能存到 150。

  ▎ Django 1.10 之前默认是 30,1.10 起改为 150,本项目用的 Django 2.1 所以是 150。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2026-4-5 08:04 , Processed in 0.012385 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表