Python 如何访问django模型的实例化属性
models.pyPython 如何访问django模型的实例化属性,python,django,django-models,Python,Django,Django Models,models.py from django.db import models from alpha_id import get_alpha_id class Sample(models.Model): alpha_id = get_alpha_id(self.id) sample_name = models.CharField(max_length=30) entry_date = models.DateField(auto_now_add=True)
from django.db import models
from alpha_id import get_alpha_id
class Sample(models.Model):
alpha_id = get_alpha_id(self.id)
sample_name = models.CharField(max_length=30)
entry_date = models.DateField(auto_now_add=True)
def __unicode__(self):
return self.alpha_id
alpha_id.py
import string
ALL_LETTERS = string.ascii_uppercase.replace('F', '').replace('I', '').replace('L', '').replace('O', '').replace('V', '')
def get_alpha_id(id):
""" Return the alpha numeric ID according to the current
integer id.
"""
global ALL_LETTERS
alpha = ALL_LETTERS[(id%len(ALL_LETTERS))-1]
return str(id) + '_' + alpha
在这里,我试图创建一个alpha_id模型属性,该属性基于自动创建的整数id属性建立一个字母数字id。我编写了一个执行算法的函数,我只需要向该方法发送当前实例化模型的id。例如:
>>> get_alpha_id(1)
1_A
>>>get_alpha_id(2)
2_B
不管怎样,我已经弄明白了逻辑。我需要做的就是弄清楚如何将示例模型的当前实例化的id属性传递给该函数
显然,我这里的问题是我没有引用类示例的实例化,因此使用“self.id”会导致错误。具体而言:
alpha_id = get_alpha_id(self.id)
NameError: name 'self' is not defined
我有一种感觉,解决方案涉及到定义一个uu init_u方法,但我不太确定我将如何去做。我查看了Model.py基类,但找不到id属性的定义位置
总之,如何访问实例化django模型的当前id,以便使用该整数值通知另一个属性的创建?您需要使用实例方法上的
@property
装饰器将其作为实例属性,而不是将alpha_id
作为类属性:
class Sample(models.Model):
sample_name = models.CharField(max_length=30)
entry_date = models.DateField(auto_now_add=True)
@property
def alpha_id(self):
return get_alpha_id(self.id)
def __unicode__(self):
return self.alpha_id
您需要使用实例方法上的
@property
装饰器将其设置为实例属性,而不是将alpha_id
设置为类属性:
class Sample(models.Model):
sample_name = models.CharField(max_length=30)
entry_date = models.DateField(auto_now_add=True)
@property
def alpha_id(self):
return get_alpha_id(self.id)
def __unicode__(self):
return self.alpha_id
您需要使用实例方法上的
@property
装饰器将其设置为实例属性,而不是将alpha_id
设置为类属性:
class Sample(models.Model):
sample_name = models.CharField(max_length=30)
entry_date = models.DateField(auto_now_add=True)
@property
def alpha_id(self):
return get_alpha_id(self.id)
def __unicode__(self):
return self.alpha_id
您需要使用实例方法上的
@property
装饰器将其设置为实例属性,而不是将alpha_id
设置为类属性:
class Sample(models.Model):
sample_name = models.CharField(max_length=30)
entry_date = models.DateField(auto_now_add=True)
@property
def alpha_id(self):
return get_alpha_id(self.id)
def __unicode__(self):
return self.alpha_id
这非常有效。我得仔细看看这里到底发生了什么。谢谢。@Malonge For ref:,您也可以在
alpha\u id
方法中的属性中缓存id,这样您就不会每次都像这样运行函数:if not hasattr(self),\u alpha\u id'):self.\u alpha\u id=get\u alpha\u id(self.id);返回自我。_alpha_id
,它工作得很好。我得仔细看看这里到底发生了什么。谢谢。@Malonge For ref:,您也可以在alpha\u id
方法中的属性中缓存id,这样您就不会每次都像这样运行函数:if not hasattr(self),\u alpha\u id'):self.\u alpha\u id=get\u alpha\u id(self.id);返回自我。_alpha_id
,它工作得很好。我得仔细看看这里到底发生了什么。谢谢。@Malonge For ref:,您也可以在alpha\u id
方法中的属性中缓存id,这样您就不会每次都像这样运行函数:if not hasattr(self),\u alpha\u id'):self.\u alpha\u id=get\u alpha\u id(self.id);返回自我。_alpha_id
,它工作得很好。我得仔细看看这里到底发生了什么。谢谢。@Malonge For ref:,您也可以在alpha\u id
方法中的属性中缓存id,这样您就不会每次都像这样运行函数:if not hasattr(self),\u alpha\u id'):self.\u alpha\u id=get\u alpha\u id(self.id);返回自我。_alpha_id