内容简介:在本章中将分享一些模型设计上的技巧和命名约定,以便提高代码的可读性。首当其冲的是遵守模型定义就是定义一个类,所以总是用驼峰法来命名(没有下划线),例如: User, Permission, ContentType 等。
起步
在本章中将分享一些模型设计上的技巧和命名约定,以便提高代码的可读性。
首当其冲的是遵守 PEP8 中的规范,其次是可以了解下 Django的编码风格 。
模型的命名规范
模型定义就是定义一个类,所以总是用驼峰法来命名(没有下划线),例如: User, Permission, ContentType 等。
属性及方法名则用匈牙利命名法,如:first_name, last_name 等。
from django.db import models class Company(models.Model): name = models.CharField(max_length=30) vat_identification_number = models.CharField(max_length=20)
始终使用 单数
命名您的模型。称之为 Company
而不是 Companies
。模型定义是单个对象的表示(此示例中的对象是公司),而不是公司的集合。
模型属性方法的定义顺序
Django编码样式建议以下内部类,方法和属性的顺序:
-
定义模型字段 选项
,如定义字段的
choices
信息; - 所有数据库字段;
- 自定义管理器属性;
-
class Meta
代码段; -
def __str__()
方法; -
def save()
方法; -
def get_absolute_url()
; - 其他自定义方法。
例如:
from django.db import models from django.urls import reverse class Company(models.Model): # 定义模型选项 PUBLIC_LIMITED_COMPANY = 'PLC' PRIVATE_COMPANY_LIMITED = 'LTD' LIMITED_LIABILITY_PARTNERSHIP = 'LLP' COMPANY_TYPE_CHOICES = ( (PUBLIC_LIMITED_COMPANY, 'Public limited company'), (PRIVATE_COMPANY_LIMITED, 'Private company limited by shares'), (LIMITED_LIABILITY_PARTNERSHIP, 'Limited liability partnership'), ) # 数据库字段 name = models.CharField('name', max_length=30) vat_identification_number = models.CharField('VAT', max_length=20) company_type = models.CharField('type', max_length=3, choices=COMPANY_TYPE_CHOICES) # 设置模型管理器 objects = models.Manager() limited_companies = LimitedCompanyManager() # 定义元数据 class Meta: verbose_name = 'company' verbose_name_plural = 'companies' # __str__ 方法 def __str__(self): return self.name # SAVE METHOD def save(self, *args, **kwargs): do_something() super().save(*args, **kwargs) # Call the "real" save() method. do_something_else() # ABSOLUTE URL METHOD def get_absolute_url(self): return reverse('company_details', kwargs={'pk': self.id}) # 其他方法 def process_invoices(self): do_something()
外键相关的建议
禁用物理外键
这是某个DBA给的建议,在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,非常耗时。所以在有外键关联时,尽量选择逻辑外键。我们可以使用 db_constraint=False
不让它们在 mysql 层面建立外键关联,也不影响开发者在ORM上的操作:
class Company: name = models.CharField(max_length=30) class Employee: first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) company = models.ForeignKey(Company, on_delete=models.CASCADE, db_constraint=False)
related_name使用复数形式
ForeignKey
中的 related_name
属性有时非常有用它让我们为反向关系定义一个有意义的名称。
class Company: name = models.CharField(max_length=30) class Employee: first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) company = models.ForeignKey(Company, on_delete=models.CASCADE, db_constraint=False, related_name='employees')
这将为 Company
模型添加一个名为 employees
特殊属性,改属性将返回与该公司相关的所有员工的数据:
google = Company.objects.get(name='Google') google.employees.all() # 若没设置 related_name 则默认为 google.employee_set.all() google.employees.filter(is_active=True) new_user = Employee.objects.create(first_name='Vitor') google.employees.add(new_user) # 反向关联
NULL 和 空字符串
基于文本的字段不要用 null=True
。否则,会有两个情况都表示“无数据”即 NULL 和空字符串。但可以设置 blank=True
的。
null=True 与 blank=True的区别是什么?
- null=bool:它与数据相关,定义该字段在数据库是否允许为空;
- blank=bool:它与验证相关,表现在表单中是否必填。
class Person(models.Model): name = models.CharField(max_length=255) # Mandatory bio = models.TextField(max_length=500, blank=True, default='') # Optional (don't put null=True)
以上所述就是小编给大家介绍的《Django 模型设计上的一些建议》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
浪潮之巅(第三版)(上下册)
吴军 / 人民邮电出版社 / 2016-5 / 99.00元
一个企业的发展与崛起,绝非只是空有领导强人即可达成。任何的决策、同期的商业环境,都在都影响着企业的兴衰。《浪潮之巅》不只是一本历史书,除了讲述科技顶尖企业的发展规律,对于华尔街如何左右科技公司,以及金融风暴对科技产业的冲击,也多有着墨。此外,这本书也着力讲述很多尚在普及 或将要发生的,比如微博和云计算,以及对下一代互联网科技产业浪潮的判断和预测。因为在极度商业化的今天,科技的进步和商机是分不开的。......一起来看看 《浪潮之巅(第三版)(上下册)》 这本书的介绍吧!