感谢您花时间查看此查询。
我在Django模型中设置了一个ID字段,这是一个CharField,如下所示:
my_id = models.CharField(primary_key=True, max_length=5,
validators=[RegexValidator(
regex=ID_REGEX,
message=ID_ERR_MSG,
code=ID_ERR_CODE
)])
我想添加一个default/blank或null选项,该选项调用一个全局或类函数,该函数将遍历现有ID,找到第一个不存在的ID,并将其分配为下一个用户ID。但是,当我添加调用blank=foo()
时,我得到一个错误代码,该函数不存在。
最佳,pb
Edit 1:我还尝试使用单独的utils文件并导入函数,但是(不出所料)我得到了一个循环导入错误,因为我需要调用类来获取对象。
编辑2(回复尤金):尝试过了,解决了循环导入问题,但我得到了以下错误:
TypeError: super(type, obj): obj must be an instance or subtype of type
以前,我对保存函数的覆盖工作得很好:
def save(self, *args, **kwargs):
self.full_clean()
super(Staff, self).save(*args, **kwargs)
自定义身份证功能:
def get_id_default():
from .models import MyObj
for temp_id in range(10_000, 100_000):
try:
MyObj.objects.get(my_id=str(temp_id))
except ObjectDoesNotExist:
break # Id doesn't exist
return str(hive_id)
**编辑3(回复PersonPr 7):**不幸的是,kwargs字典里似乎没有我的id。实际上,打印后,kwargs字典是空的。
保存功能:
def save(self, *args, **kwargs):
print(kwargs) # --> Returns {}
if kwargs["my_id"] is None:
kwargs["my_id"] = self.get_id_default()
self.full_clean()
super(Staff, self).save(*args, **kwargs)
其中get_id_default是一个类函数:
def get_id_default(self):
for temp_id in range(10_000, 100000):
try:
self.objects.get(my_id=str(temp_id))
except ObjectDoesNotExist:
break # Id doesn't exist
return str(temp_id)
解决方案1:
对于那些可能在未来与此作斗争的人来说:
创建一个utils/script.py文件(或者你想叫它的任何名称),并在其中创建你的自定义脚本。
from .models import MyModel
def my_custom_default:
# your custom code
return your_value
Inside the main.models.py file.
from django.db import models
from .my_utils import my_custom_default
class MyModel(model.Model):
my_field = models.SomeField(..., default=my_custom_default)
**解决方案2:**在Model类中创建一个静态函数,该函数将创建默认值。
@staticmethod
def get_my_default():
# your logic
return your_value
# NOTE: Initially I had the function use self
# to retrieve the objects (self.objects.get(...))
# However, this raised an exception: AttributeError:
# Manager isn't accessible via Sites instances
设置模型时,为字段指定某种默认值,例如default=None
此外,您需要覆盖模型保存功能,如下所示:
def save(self, *args, **kwargs):
if self.your_field is None:
self.my_field = self.get_my_default()
self.full_clean()
super().save(*args, **kwargs)
1条答案
按热度按时间kqlmhetl1#
尝试覆盖模型的保存方法并执行其中的逻辑:
编辑:你不需要使用**kwargs,你可以通过保存方法访问整个模型,并遍历对象/id。