将Django字段设置为函数结果

时间:2014-10-21 15:50:03

标签: django field

我想创建一个IntegerField并根据我下载的.json设置值,所以我的代码是:

class InstagramShowcase(models.Model):

def numero(name):
    datos = urllib2.urlopen('https://api.instagram.com/v1/users/search?q=' + str(name) +'&client_id=573c505763dd4bee80d29d105f901ab5')
    resultados = json.load(datos)

    return resultados["data"][0]["id"]

name = models.CharField(max_length=180)
instagramUser = models.CharField(max_length=40)
website = models.URLField(blank=True)
numberid = models.IntegerField()

def __unicode__(self):
    return '%s' % self.name

def __init__(self, *args, **kwargs):
    self.numberid = self.numero(self.name)

但是当我尝试syncdb时,会出现:

AttributeError: 'module' object has no attribute 'numero'

为Field赋予函数值的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您尝试将模型类的属性定义为依赖于模型实例;这是不可能的,因为在定义类及其属性之前,实例不存在(也不能存在)。

要获得所需的效果,请覆盖模型类的save()方法。根据需要对实例进行任何更改,然后调用超类的方法进行实际保存。这是一个简单的例子。

def save(self, *args, **kwargs):
    if not self.numberid:
        self.numberid = self.numero()
    super(InstagramShowcase, self).save(*args, **kwargs)

还在类中定义'numero'函数以使其工作。 详细了解覆盖模型方法here

答案 1 :(得分:0)

我已经向一位朋友询问并最终得到了解决方案:

作为@kviktor,我添加了super(InstagramShowcase,self)。 init (* args,** kwargs)以及之后

if self.name:
        if not self.numberid:
            self.numberid = numero(self.name)
            self.save()

这样当我在管理员中输入一个新对象时,如果没有名称,它就不会进行查询而且我有1个错误。当我保存一次被编辑时,有一个名字,就像@kviktor说的那样,为了避免在我创建一个时进行多次查询,我检查是否已经有一个数字ID,如果有,它什么也没做。

对不起我的英语我希望你理解我。谢谢你的帮助