gpt4 book ai didi

python - 来自常量的 Django 模型字段?

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:04 25 4
gpt4 key购买 nike

如何在常量中定义 Django 模型字段并在任何地方使用。例如,如果我有一个像这样的模型:-

class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()

我想做的是为 Author 模型中的字段定义常量,并在模型中提供常量而不是字段名称,例如:-

KEY_FIRST_NAME = 'first_name'
KEY_LAST_NAME = 'last_name'
KEY_EMAIL = 'email'

并且 Author 模型应该使用常量而不是精确的键,例如:-

class Author(models.Model):
KEY_FIRST_NAME = models.CharField(max_length=30)
KEY_LAST_NAME = models.CharField(max_length=40)
KEY_EMAIL = models.EmailField()

如何做这样的事情,直接赋值给常量在这里是行不通的。

我想将所有的字段名存储在常量中,并且在任何需要的地方我都想使用常量而不是字符串字段名。

这样做的目的是如果在未来的版本中文件名有任何变化,那么我只想在一个地方改变,它应该反射(reflect)在所有地方。

如果这是不可能的,或者它会使代码过于复杂,就像@dirkgroten 的一种方法所建议的那样,而不是将模型字段定义为常量并在其他地方使用它们的最佳实践(除了内部模型,如 if我们指的是管理门户或任何其他地方的那些字段。

最佳答案

简短的回答:你不能用 Python 做到这一点,句号(实际上我认为你不能用任何语言做到这一点,但肯定有人会证明我错了 xD)。

现在,如果我们回到您真正的“问题”——如果您的模型的字段名称要更改,则不必更改客户端代码——您首先需要判断您是指“python 属性名称”还是“基础数据库字段名”。

对于第二种情况,数据库字段名称不必与 Python 属性名称匹配,Django models fields take a db_column argument处理这种情况。

对于第一种情况,我不得不说这是一个非常普遍的(无论如何都不是新的)API 设计问题,通常的答案是“您不应该更改属于您的公共(public)名称的名称API 一旦发布”。现在 sh!t 发生了,有时你必须这样做。这里最好的解决方案是使用计算属性在弃用期间将旧名称重定向到新名称,并在移植所有客户端代码后将其删除。

您的模型示例,将“first_name”更改为“firstname”:

class Author(models.Model):
# assuming the database column name didn't change
# so we can also show how to us `db_column` ;)

firstname = models.CharField(
max_length=30,
db_column='first_name'
)

@property
def first_name(self):
# shoud issue a deprecation warning here
return self.firstname

@first_name.setter
def first_name(self, value):
# shoud issue a deprecation warning here
self.firstname = value

如果你有十几个字段要重命名,你肯定会想要编写一个自定义描述符(=> 计算属性)而不是让它保持干燥:

class Renamed(object):
def __init__(self, new_name):
self.new_name = new_name

def __get__(self, instance, cls):
if instance is None:
return self

# should issue a deprecation warning here
return getattr(instance, self.new_name)

def __set__(self, instance, value):
# should issue a deprecation warning here
setattr(instance, self.new_name, value)


class Author(models.Model):
firstname = models.CharField(
max_length=30,
db_column='first_name'
)
first_name = Renamed("firstname")

关于python - 来自常量的 Django 模型字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46053367/

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