gpt4 book ai didi

python - Django 模型字段默认基于同一模型中的另一个字段

转载 作者:IT老高 更新时间:2023-10-28 21:33:14 25 4
gpt4 key购买 nike

我有一个模型,我想包含一个主题名称和他们的首字母缩写(他的数据有些匿名并通过首字母缩写进行跟踪)。

现在,我写了

class Subject(models.Model):

name = models.CharField("Name", max_length=30)
def subject_initials(self):
return ''.join(map(lambda x: '' if len(x)==0 else x[0],
self.name.split(' ')))
# Next line is what I want to do (or something equivalent), but doesn't work with
# NameError: name 'self' is not defined
subject_init = models.CharField("Subject Initials", max_length=5, default=self.subject_initials)

如最后一行所示,我希望能够将首字母作为字段(与名称无关)实际存储在数据库中,但它是使用基于名称字段的默认值进行初始化的。但是,我遇到了问题,因为 django 模型似乎没有“ self ”。

如果我将行更改为 subject_init = models.CharField("Subject initials", max_length=2, default=subject_initials),我可以执行 syncdb,但无法创建新主题。

这在 Django 中是否可能,让一个可调用函数根据另一个字段的值为某个字段提供默认值?

(出于好奇,我想分开我的商店首字母缩写的原因是在极少数情况下奇怪的姓氏可能与我正在跟踪的姓氏不同。例如,其他人决定主题 1 命名为“John O'Mallory "首字母是 "JM"而不是 "JO"并且想修复以管理员身份编辑它。)

最佳答案

模特当然有“ self ”!只是您试图将模型类的属性定义为依赖于模型实例;这是不可能的,因为在您定义类及其属性之前,该实例不(也不能)存在。

为了得到你想要的效果,重写模型类的save()方法。对实例进行必要的更改,然后调用父类(super class)的方法进行实际保存。这是一个简单的例子。

def save(self, *args, **kwargs):
if not self.subject_init:
self.subject_init = self.subject_initials()
super(Subject, self).save(*args, **kwargs)

这在 Overriding Model Methods 中有介绍在文档中。

关于python - Django 模型字段默认基于同一模型中的另一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4380879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com