在模型方法中使用Q对象时的NameError

时间:2014-10-17 11:52:43

标签: django django-models django-q

class BlogList(models.Model):
   title = models.CharField(max_length=100)

   def get_first_article_image(self):
      if self.bloglist_articles.exists():
          bloglist = self.bloglist_articles.filter(
                          Q(image_link != '') | Q(image_file != '') ##<---error line
                                               ).order_by('-id')[:1].get()
          if bloglist.image_file:
              return '/'.join([settings.MEDIA_URL, bloglist.image_file.name])
          if bloglist.image_link:
              return bloglist.image_link
      return None

class BlogArticle(models.Model):
   bloglist = models.ForeignKey(BlogList, related_name='bloglist_articles')
   image_file = models.ImageField(upload_to='image/', default='', blank=True)
   image_link = models.CharField(max_length=2000, blank=True)
   image_embed = models.CharField(max_length=2000, blank=True)

如果我在模板中调用

<a href="{{ bloglist_obj.get_first_article_image }}">{{bloglist.title}}</a>

我正在

NameError at /
global name 'image_link' is not defined
我做错了什么?

2 个答案:

答案 0 :(得分:1)

Q对象的语法与过滤器的语法完全相同:也就是说,您需要传递关键字和值,而不是表达式。

self.bloglist_articles.exclude(
    Q(image_link='') | Q(image_file='')
)

答案 1 :(得分:1)

@Daniel给了你答案,但实际上你的整个方法可以简化为:

def get_first_article_image(self):
   q = self.bloglist_articles.exclude(image_link='', image_file='')
   if q.exists():
      return q[0]
   return None

在你的模板中:

{% if bloglist_obj.get_first_article_image %}
   <a href="{{ bloglist_obj.get_first_article_image.image_link }}">
      <img src="{{ bloglist_obj.get_first_article_image.image_file.url }}">
   </a>
{% endif %}