django models 自定义方法报错,我这哪里写的有问题?

2022-04-25 21:19:12 +08:00
 maloneleo88
.....


class Detect(models.Model):
    def chioce_id(self):
        data = self.objects.all()
        id = len(data) + 1
        return id
    detect_id = models.BigIntegerField(verbose_name='编号',default=chioce_id)
    .......

为什么一直报我错呢? 我想弄个可自填可手改的序号, 这方法在类里不能用吗?有别的法吗?

2492 次点击
所在节点    Python
34 条回复
blueaurora
2022-04-25 21:43:31 +08:00
虽然你没有把错误的 log 贴上来,但是能发现一个错误: data = self.objects.all() .把 self 改成 Detect ,即:

data = Detect.objects.all()

因为 objects 是类中的,不是实例中的
blueaurora
2022-04-25 21:45:44 +08:00
至于 default=choice_id , 我感觉也是不对的.. 因为 choice_id 方法 却是实例中的,但字段又是类中的..
maloneleo88
2022-04-25 21:46:39 +08:00
@blueaurora 错误就是找不到定义的函数 , 谢谢!

类这里永远也搞不明白
blueaurora
2022-04-25 21:48:43 +08:00
把 detect_id 的修改逻辑从字段的 default 里摘出来吧。 不要写在 model 类的定义当中了吧
blueaurora
2022-04-25 21:49:51 +08:00
@maloneleo88 嗯嗯,default 的这个,我只是感觉可能有问题,但如果你跑通了那就忽略质疑吧, 这就是 python..
maloneleo88
2022-04-25 21:51:11 +08:00
@blueaurora 所以应该怎么做才对呢, 如你所料

进添加页面直接报
chioce_id() missing 1 required positional argument: 'self'
blueaurora
2022-04-25 21:51:56 +08:00
在 java 中,类一般都是静态写好的;但在 python 中,动态创建新类和修改类 跟玩似的
maloneleo88
2022-04-25 21:52:49 +08:00
@blueaurora 真的是到处都弄不明白,我一般是弄不了了就上 js 魔改 - -!
blueaurora
2022-04-25 21:54:45 +08:00
@maloneleo88 啊,比如这里 default 就是 0 或 -1 ; 然后 detect_id 的变化逻辑,写在业务中,比如重写 model 的 save ,在 save 时 去修改 detect_id
maloneleo88
2022-04-25 22:01:37 +08:00
@blueaurora 你的意思是在 views 里直接拿到 queryset 再往表单 val 里填吧
gotounix
2022-04-25 22:01:42 +08:00
函数写到类外面,不用参数,self 换成 Detect
westoy
2022-04-25 22:12:03 +08:00
你这个 chioce_id 的生成有点太暴力的啊..........
maloneleo88
2022-04-25 22:18:17 +08:00
@gotounix 放外面不行 NameError: name 'Detect' is not defined
maloneleo88
2022-04-25 22:19:02 +08:00
@westoy 哈哈 给出个招
maloneleo88
2022-04-25 22:20:37 +08:00
@gotounix 反正是扔上面找不到类, 扔下面好不到函数。 扔里面就报错
mimzy
2022-04-25 22:21:08 +08:00
@classmethod
def choice_id(cls):
....data = cls.objects.all()
....return len(data) + 1

确实太暴力了。
mimzy
2022-04-25 22:23:18 +08:00
@classmethod
def choice_id(cls):
....count = cls.objects.count()
....return count + 1
maloneleo88
2022-04-25 22:30:45 +08:00
@mimzy 大佬! 然后怎么调用? 这个没学到过
mimzy
2022-04-25 22:31:26 +08:00
@mimzy #16 #17 这两种写法应该有幻读( Phantom Read )的问题
mimzy
2022-04-25 22:32:00 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/849243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX