【问题标题】:AttributeError: 'QuerySet' object has no attribute 'related_stocks'AttributeError:“QuerySet”对象没有属性“related_stocks”
【发布时间】:2016-11-20 05:43:57
【问题描述】:

这里是 Django 新手。我正在尝试创建一个简单的应用程序来讨论股票,用户可以在其中创建主题并与特定股票建立多对多关系。在主题详细信息页面中,我想显示与该主题相关的所有股票。我遇到了障碍:AttributeError 'QuerySet' 对象没有属性 'related_stocks'。尽管经历了其他人提出的类似问题,但我似乎仍然无法弄清楚。任何帮助将不胜感激。请参阅下面的代码:

models.py

class Topic(models.Model):
    title = models.CharField(max_length=50)
    related_stocks = models.ManyToManyField(Stock)
    slug = models.SlugField(max_length=200, blank=True)
    created = models.DateField(auto_now_add=True,
                           db_index=True)
    def __str__(self):
    return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
            super(Topic, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('comments:topic_detail', args=[self.id, self.slug])

views.py

def topic_detail(request, id, slug):
    topic = Topic.objects.all().filter(id=id, slug=slug)
    related_stocks = topic.related_stocks
    return render(request,
                  'comments/comment/topic-detail.html',
                  {'section': 'topics',
                   'topic': topic,
                   'related_stocks': related_stocks})

topic-detail.html

{% extends "base.html" %}

{% block title %}{{ topic.title }}{% endblock %}

{% block content %}
    <h1>Stocks associated with {{ topic.title }}.</h1>
    {% for related_stock in related_stocks %}
    <ul>
        <a href="{{ related_stock.get_absolute_url }}">
            {{ related_stock.ticker }}
        </a>
    </ul>
    {% endfor %}
{% endblock %}

【问题讨论】:

    标签: python django


    【解决方案1】:
    topic = Topic.objects.all().filter(id=id, slug=slug)
    related_stocks = topic.related_stocks
    

    filter 本质上返回Topic 模型的列表,因此topic 没有related_stocks 属性。

    要么:

    1. 如果您确定 Topic.objects.all().filter(id=id, slug=slug) 将始终返回单个对象,请使用 get(请记住,如果找不到对象或发现超过 1 个对象,它将引发异常)。

    2. Topic.objects.all().filter(id=id, slug=slug) 更改为Topic.objects.all().filter(id=id, slug=slug)[0],这样您始终会选择第一个topic 对象。

    【讨论】:

    • 感谢其他建议!
    【解决方案2】:

    您应该使用用户获取而不是过滤器:

    topic = Topic.objects.get(id=id, slug=slug)
    

    过滤器返回数组。 get 只返回一个对象,需要处理对象不存在的场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 2019-07-10
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2022-12-10
      相关资源
      最近更新 更多