调用函数来获取模型字段值

时间:2015-09-02 06:40:28

标签: django django-models

我正在尝试获取字段的唯一值(在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列以确保值是唯一的 - 或者 - 是否有内置的方法来执行此操作?

我已经尝试或看过的内容:

  1. 为字段设置unique=True并使用default=uuid.uuid4 - 这会为我提供重复值并生成验证错误(SO link

  2. 我知道Django 1.8's UUID field,但我在1.7

1 个答案:

答案 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

你会看到差异。这应该有助于您更好地理解这个问题。