从零实现Django Model字段

本文通过四个逐步进阶的Python例子,深入探讨了Django Model字段的实现机制,涉及Python动态属性、描述符类和设计模式。通过模拟Django字段的行为,揭示了Model字段赋值限制及其属性的实现方式,最后指出Django内部也是采用类似原理来实现Model字段的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习资源

在这里插入图片描述

本次学习目标

搞清楚Django的模型字段是如何实现的?
Django里常常有这样的代码:

class MyModel(models.Model):
	name = models.CharField(verbose_name='姓名', max_length=10)
	age = models.PositiveIntegerField(verbose_name='年龄')

CharField这样的模型字段赋值直接:

obj.name = '蛮三'

除此之外字段还有其他许多属性,像

obj.age = '法克鱿'

这样的语句是不允许的,在obj.save()时会报错
这一点是怎么实现的呢?

学习主题

Python动态属性、描述符类

第一个例子

我要去买一斤苹果,已经知道要买的水果名称、价格还有数量,问我一共要付多少钱呢?如何用Python来实现?
答案:

class LineItem:
    def __init__(self, goods, price, nums):
        self.goods = goods
        self.price = price
        self.nums = nums
        
    def subtotal(self):
        return self.price * self.nums

goods = 'apple'
price = 18
nums = 1
item = LineItem(goods, price, nums)

print('顾客:我要{}斤{}'.format(nums, goods))
print('老板:好的,一共{}块钱'.format(item.subtotal()))

输出:

顾客:我要1斤apple
老板:好的,一共18块钱

你可能会发现,如果我把nums设置为负数,那老板倒要给我找钱了,为了维护老板的利益,我决定解决这个BUG,修改以上代码如下:

class LineItem:
    def __init__(self, goods, price, nums):
        self.goods = goods
        self.price = price
        self.nums = nums
        
    @property
    def price(self):
        return self.__price
    
    @price.setter
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值