Django.models自定义空白值

cqoc49vn  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(112)

感谢您花时间查看此查询。
我在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)
kqlmhetl

kqlmhetl1#

尝试覆盖模型的保存方法并执行其中的逻辑:

def save(self, *args, **kwargs):
    #Custom logic
    super().save(*args, **kwargs)

编辑:你不需要使用**kwargs,你可以通过保存方法访问整个模型,并遍历对象/id。

相关问题