内容简介:在本章中将分享一些模型设计上的技巧和命名约定,以便提高代码的可读性。首当其冲的是遵守模型定义就是定义一个类,所以总是用驼峰法来命名(没有下划线),例如: 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 模型设计上的一些建议》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
奇点系列
彼得•蒂尔、里德•霍夫曼、本•霍洛维茨、埃里克•杰克逊等 / 高玉芳、路蒙佳、杨晓红、徐彬等 / 中信出版社 / 2015-6-20 / 182.00
1.硅谷创投教父、PayPal创始人彼得•蒂尔、LinkedIn创始人里德•霍夫曼、创业导师本•霍洛维茨、“PayPal黑帮”初创成员埃里克•杰克逊联合作品。 2.彼得•蒂尔与埃隆•马斯克的首次交锋,PayPal从0到1改变全球金融的生死突围,商业硬汉的创业史诗,揭秘“PayPal黑帮”的创业维艰与联盟关系。 3.《人民日报》推荐创业者必读书目!“奇点系列”的作者们以及“PayPal黑......一起来看看 《奇点系列》 这本书的介绍吧!