Dajngo开发常见问题汇总 -- Model设计篇

  1. verbose_name 可以作为第一个参数传入,使书写更加工整和有序;
name = models.CharField('类别名',default="", max_length=30,help_text="类别名")
  1. 请尽量为每个model和field设置 verbose_name,也尽量为每个model实现__str__方法,便于项目的文档化管理;
class Meta:
    verbose_name = '商品轮播'
    verbose_name_plural = verbose_name

def __str__(self):
    return self.goods.name
  1. null=True, blank=True 一般同时出现,前者表示数据库字段可以为null,后者表示form中required = False,即可以为空白;
birthday = models.DateField("出生年月",null=True, blank=True)
  1. 使用unique参数添加‘唯一约束’;
order_sn = models.CharField("订单编号",max_length=30, null=True, blank=True, unique=True)

class Meta:
    verbose_name = '用户收藏'
    verbose_name_plural = verbose_name
    unique_together = ("user", "goods")
  1. 外键需要设置 on_delete=models.CASCADE,表示级联删除(默认);
category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name="商品类目")
  1. 利用类似 get_user_model 的方法来实现Model之间的解耦;
# get_user_model方法会去setting中找AUTH_USER_MODEL
from django.contrib.auth import get_user_model
User = get_user_model()
  1. related_name 可以为外键反向查询的manager命名;
goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品", related_name="images")
  1. 无论USE_TZ is False/True,请尽量使用django.utils.timezone.now(),当然更好的方法是使用 auto_now/auto_now_add = True;
add_time = models.DateTimeField(default=timezone.now, verbose_name="添加时间")
  1. 善用审计字段: DateTimeField和DateField的auto_now_add和auto_now
class RegisterBooklet(models.Model):
    description = models.CharField(max_length=255)
    status = models.CharField(max_length=10)
    created_at = models.DateTimeField(auto_now_add=True)     # 自动填充新增时间
    updated_at = models.DateTimeField(auto_now=True)         # 自动填充更新时间
  1. 根据数据库表反向生成Model
python manage.py inspectdb   # 使用这条命令,会根据设置的数据库中全部的表在自动生成对应的Model代码,并打印出来

python manage.py inspectdb > student/models.py   # 当然也可以直接将打印的代码直接导入到指定的Model文件中,前提是创建了app(student)并且在setting.py文件中注册过

python manage.py inspectdb --database default >student/models.py  # 配置多个数据库时,可以根据数据库别名来指定,default是默认的别名

python manage.py inspectdb --database default table1 table2 >student/models.py # 指定default数据库的table1和table2反向生成Model

PS:


常见问题01:使用--fake和--fake-inital重置migration

1、来源

Django开发过程中如果数据库变动过多导致migrations的文件越来越多,管理起来很不方便, 幸运的是Django提供了一种方式可以是这些文件重置到0001状态,而且不删除原有数据。

2、解决办法

常见问题02:不使用物理外键,但又不破坏 Django 的反向关联查询

1、来源

数据库在高并发的场景下使用外键约束会有锁问题,并且使用外键会增加运维成本,也无法实行分库分表,所以很多公司都规定生产环境的数据库禁止使用外键。

2、解决办法

posted @ 2023-02-06 19:14  又是火星人  阅读(29)  评论(0编辑  收藏  举报