python - django要想定制model.objects.create(xxxx)的行为怎么处理?
怪我咯
怪我咯 2017-04-18 09:06:01
[Python讨论组]

现在有一个model

class Order(Model):
    order_no = CharField(max_length=10)
    name = CharField(max_length=100)

现在要在创建订单的时候,自动生成order_no的内容
就是希望这样

order = Order.objects.create(name='xxx')

然后自动生成order_no的内容

order_no = datetime.datetime.now.strftime('%Y%m%d' + seq)

这个create的行为怎么定制呢?没找到源码。还是应该改save()方法?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(5)
PHPz

模型不要动,你要迟早要复用,可以在模型下写个方法,调用就行,反正你调用方法前一定要调用模型,那不如把方法写到模型里面去。不过这是小规模的做法,大规模后重构成多个文件就可以了。

PHP中文网

两种方法,分别对应用 create 和 save:

1、create
改写相应 model 的 manager:

class MyOrderManager(models.Manager):
    def create(self, *args, **kwargs):
        kwargs['order_no'] = datetime.datetime.now.strftime('%Y%m%d' + seq)
        super(MyOrderManager, self).create(*args, **kwargs)  

class Order(models.Model):
    xxx = xxx
    objects = MyOrderManager()

2、复写 save:

class Order(models.Model):
    xxx = xxx
    
    def save(self, *args, **kwargs):
        self.order_no = datetime.datetime.now.strftime('%Y%m%d' + seq)
        super(Order, self).save(*args, **kwargs)
黄舟

我覺得不用動 Model 耶...,在 create data 的時候設置就好了阿?

in views.py:

order_no = datetime.datetime.now.strftime('%Y%m%d' + seq)
order = Order.objects.create(name='xxx', order_no=order_no)

其實這樣也是自動阿!


我回答過的問題: Python-QA

迷茫

在django中每个模型都有个manager用于管理表级别的操作,例如order.objects中的objects就是默认的manager,你可以继承django的models.Manager来写各种方法,包括在创建数据时保存时间信息,具体可以看django book里添加额外的manager的方法

高洛峰

改save方法,

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号