2012-11-12 113 views
1

我的问题是这样的。Django功能模型错误

例如下面的代码。控制台抛出一个关于找不到模型'ModelB'的错误。

class modela(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=360) 

    def print_name_modelb(self): 
     modelb = modelb.objects.get(id=1) 
     print modelb.name 

class modelb(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=360) 

有没有什么办法可以设置所有的空模型在函数中使用,如果识别?


用真实数据编辑。

class Vip2ProductosPlantilla(models.Model): 
    id = models.IntegerField(primary_key=True) 
    nombre = models.CharField(max_length=360) 
    referencia = models.CharField(max_length=300) 
    intro = models.TextField() 
    descripcion = models.TextField() 
    precio_tienda = models.DecimalField(max_digits=12, decimal_places=2) 
    precio_vip = models.DecimalField(max_digits=12, decimal_places=2) 
    precio_cesion = models.DecimalField(max_digits=12, decimal_places=2) 
    zoom = models.BooleanField() 
    id_marca = models.ForeignKey(Vip2Marcas, null=True, db_column='id_marca', blank=True) 
    categoria = models.ManyToManyField(Vip2Categorias) 
    stock = models.IntegerField(null=True, blank=True, default=0) 
    last_update = models.DateTimeField(auto_now=True) 
    gastos_envio = models.DecimalField(max_digits=12, decimal_places=2,blank=True,null=True) 

    def get_precio(self): 
     try: 
      precio = MLPreciosProductos.objects.filter(plantilla=self)[0] 
      if (precio != None) & (precio.precio_ml > 0): 
       print 'precio ml' 
       return precio.precio_ml 
      else: 
       print 'precio vip' 
       return self.precio_vip 
     except: 
      print 'precio vip error' 
      return self.precio_vip 

class MLPreciosProductos(models.Model): 
    id = models.AutoField(primary_key=True) 
    plantilla = models.ForeignKey(Vip2ProductosPlantilla,null=True, db_column='plantilla', blank=True) 
    precio_ml = models.DecimalField(max_digits=12, decimal_places=2) 
    campana = models.ForeignKey(Vip2Campanas, null=True, db_column='campana', blank=True) 

当模板函数调用get_precio,除了根据您最后的评论被抛出


Traceback: 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/opt/marketland.es/web/marketland/views.py" in outlet_campana 
    127.   context_instance=RequestContext(request))  
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/shortcuts/__init__.py" in render_to_response 
    20.  return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/loader.py" in render_to_string 
    188.   return t.render(context_instance) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in render 
    123.    return self._render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    127.   return compiled_parent._render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    127.   return compiled_parent._render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    64.    result = block.nodelist.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    64.    result = block.nodelist.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render 
    227.     nodelist.append(node.render(context)) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/debug.py" in render 
    90.    output = self.filter_expression.resolve(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in resolve 
    510.     obj = self.var.resolve(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in resolve 
    653.    value = self._resolve_lookup(context) 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup 
    698.        current = current() 
File "/home/opt/marketland.es/web/marketland/models.py" in get_precio 
    201.   precio = MLPreciosProductos.objects.filter(plantilla=self)[0] 
File "/home/opt/ENV-django/local/lib/python2.7/site-packages/django/db/models/query.py" in __getitem__ 
    190.    return list(qs)[0] 

Exception Type: TemplateSyntaxError at /outlet/atornillador-blackampdecker-pilas-aaa-558/ 
Exception Value: Caught IndexError while rendering: list index out of range 
+0

那些都在同一个文件中,就像你在这里显示的那样? –

+0

你做了什么:'python manage.py syncdb' – piokuc

+0

是的,我已经在同一个文件中的所有模型 – Fraskito

回答

-1

“我再次编辑。但故障现在给因为试图让precio = MLPreciosProductos.objects.filter(plantilla=self)[0]或找到一个“

我认为你cann只要过滤器self尝试改变它与self.idself.nombre任何你想要的,只要它是在课堂上定义。请原谅我英语不好,只是想帮助

+0

感谢您的回答。 如果我可以自己过滤。现在一切正常,我不知道为什么。刚刚添加到我的尝试/除了这一行显示控制台exepcion print'\ n'.join(traceback.format_exception(* sys.exc_info())) – Fraskito

0

解决这个问题的方法之一是在modela之前在同一个文件中定义modelb。 Python是一种脚本语言,并且是逐行执行的,因此当您在示例中引用modelb时,它还不存在。
不过,有时你需要两个模型指彼此在ForeignKey,在这种情况下,你可以通过模型作为字符串的名称:

campana = models.ForeignKey('Vip2Campanas') 

这可能会导致问题的另一件事是过滤给一个对象:

MLPreciosProductos.objects.filter(plantilla=self) 

因为对象可以动态变化,并且,事实上,指针,最好还是自己的ID这样的识别对象:

MLPreciosProductos.objects.filter(plantilla_id=self.id) 

或使用的Django的创建幕后反向查找:

Foo(models.Model): 
    pass 

Bar(models.Model): 
    foo = models.ForeignKey('Foo') 

# instance of a Foo model is given 'hidden' field bar_set 
foo.bar_set 

(modelname)_set被自动添加,并允许获取由外键链接到对象的所有条目的列表。