我想创建一个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赋予函数值的正确方法是什么?
答案 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,如果有,它什么也没做。
对不起我的英语我希望你理解我。谢谢你的帮助