django要想定制model.objects.create(xxxx)的行为怎么处理?

现在有一个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()方法?

阅读 7.4k
5 个回答

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

两种方法,分别对应用 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方法,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题