Django模型的简单使用


Django模型的参数笔记

1、通用参数

  • max_length 长度

  • unique 是否唯一

  • null 数据库是否可以为null

  • blank 前端是否必填

  • primary_key 是否为主键

  • default 默认值

  • choices 可选值

2、外键参数

2.1、to_field 指定关联的字段

如果不使用to_filed,默认关联的是ID,例如:

group表中有一条ID是1的记录

user表中关联的字段就是group中的ID字段

如果使用to_filed,默认关联的是指定字段,如果该字段不存在,则会报错

使用to_filed关联group表的name字段to_field="name",name字段需要是唯一,因为关联是唯一的,例如

group表中有一条ID是1的记录

user表中关联的字段就是group中的name字段

可以看到关联字段是name字段了,但是字段名还是显示以id关联,通过db_column指定

2.2、db_column 指定字段名

使用了db_column="group_name"

2.3、related_name 反向关系

举例:一个用户组可以拥有多个用户,而一个用户只能属于一个用户组,用户组对于用户属于一对多

正向查询:查询某个用户属于的组

user: User = User.objects.filter(name="admin").first()
user_group = user.group
print(user_group)

反向查询:查询某个用户组拥有的用户是哪些

通过模型名称_set来指定反向关系(本例子就是user_set)

admin_group = Group.objects.filter(name="admin组").first()
users = admin_group.user_set.all()
print(users)

上面是不使用related_name的情况,使用了related_name就可以直接使用related_name="group_users"指定的名字来反向了

admin_group = Group.objects.filter(name="admin组").first()
users=admin_group.group_users.all()

3、模型代码

from django.db import models


class User(models.Model):
    id = models.AutoField(primary_key=True)
    uid = models.CharField("用户ID", max_length=30, unique=True, null=False, blank=False)
    name = models.CharField("用户名", max_length=30, unique=True, null=False, blank=False)
    email = models.EmailField("用户邮箱", max_length=30, unique=True, null=False, blank=False)
    group = models.ForeignKey(
        "Group",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        default=None,
        to_field="name",  # 指定关联字段             (默认是id)
        db_column="group_name",  # 指定列名          (默认是模型名称_id例如:group_id)
        related_name="group_users"  # 指定反向关系    (默认是模型名称_set例如:user_id)
    )

    created = models.DateTimeField("创建时间", auto_now_add=True)
    updated = models.DateTimeField("修改时间", auto_now=True)


class Group(models.Model):
    id = models.AutoField(primary_key=True)
    gid = models.CharField("用户组ID", max_length=30, unique=True, null=False, blank=False)
    name = models.CharField(
        "用户组名称", max_length=30, unique=True, null=False, blank=False
    )

    created = models.DateTimeField("创建时间", auto_now_add=True)
    updated = models.DateTimeField("修改时间", auto_now=True)