我正在尝试获取字段的唯一值(在db列中唯一)。
我的代码(省略了其他模型字段):
class PlatformUserChildren(models.Model):
dashboard = models.CharField('dashboard URL', max_length=64, unique=True, default=createDashboardCode(self))
def createDashboardCode(self):
stringCheck = False
while stringCheck is False:
newString = str(uuid.uuid4())[:32]
doesStringExist = newString in self.dashboard
if not doesStringExist:
stringCheck = True
return newString
我将名称'self'定义为为错误。
我应该将什么传递给函数,以便我可以检查db列以确保值是唯一的 - 或者 - 是否有内置的方法来执行此操作?
我已经尝试或看过的内容:
为字段设置unique=True
并使用default=uuid.uuid4
- 这会为我提供重复值并生成验证错误(SO link)
我知道Django 1.8's UUID field,但我在1.7
答案 0 :(得分:0)
问题在于以下行(缩进以提高可读性),正如您之前已经知道和提到的那样:
dashboard = models.CharField(
'dashboard URL',
max_length=64,
unique=True,
default=createDashboardCode(self)
)
在这部分:
default=createDashboardCode(self)
您使用参数createDashboardCode
调用方法self
。这是错误的,因为您永远不会将self
传递给Python传递的方法。每当你调用方法createDashboardCode
时,你应该这样做:
createDashboardCode()
就是这样,你没有明确地传递参数self
。
您收到错误“未定义名称'self'”,因为未定义self
。您的代码中没有可以传递给方法的变量self
。
现在我们更进了一步,但如果您只是对代码应用这一细微更改,那么您的问题将无法解决。
方法createDashboardCode
的返回值将分配给default
。那不是你真正想要的。您必须将方法的引用分配给default
:
default = createDashboardCode
注意缺少的括号。这将在每次创建模型的新实例时调用该方法
定义一个函数:
def my_function():
print "hello"
并在Python解释器中运行它:
# once like this
my_function()
# and again like this
my_function
你会看到差异。这应该有助于您更好地理解这个问题。