Django View 检查第二个模型的价值

偷窥者

我对 Django 有点陌生,所以请耐心等待。我的应用程序中有三个模型:公司、文章和成绩单。Articles 和 Transcripts 都有一个foreignkey() 字段链接到公司模型。在我的主要视图中,我列出了所有公司,但我想指出是否有每家公司的文章或成绩单。

以下是模型:

class Company(models.Model):
    stock_symbol = models.CharField(max_length=5, unique=False)
    company_name = models.CharField(max_length=200)
    address = models.CharField(max_length=300, blank=True)
    website = models.URLField(max_length=200, blank=True)
    following = models.BooleanField()

class Articles(models.Model):
    company = models.ForeignKey('Company', related_name='articles')
    headline = models.CharField(max_length=200)
    url = models.URLField(max_length=300, blank=True)

class Transcripts(models.Model):
    company = models.ForeignKey('Company', related_name='transcripts')
    headline = models.CharField(max_length=200)
    url = models.URLField(max_length=300, blank=True)

下面是单个公司的视图,但是由于我要返回所有公司,因此显然不能使用主键。我将如何获取每个公司的这些信息?我是否以正确的方式设置模型?

class CompanyDetails(generic.DetailView):
    model = Company
    template_name = 'company_details.html'

    def get_context_data(self, **kwargs):
        pk = self.kwargs.get('pk')
        context = super(CompanyDetails, self).get_context_data(**kwargs)
        context['company'] = Company.objects.filter(id=pk)            
        context['articles'] = Articles.objects.filter(company_id=pk).order_by('-date')
        context['transcripts'] = Transcripts.objects.filter(company_id=pk).order_by('-date')
        return context

更新

如果我想在列中显示每个公司至少有一篇文章,我该如何更新模板?当我在答案中尝试 for 循环时,它为每篇文章创建了一个列,因此我尝试将其更改为以下内容,但每条记录都显示为“空白”。

    <tbody>
        {% for company in all_companies %}
        <tr>
            <td nowrap="true"><a href="{% url 'company_details' pk=company.pk %}">{{ company.company_name }}</a></td>
            <td nowrap="true">{{ company.stock_symbol }}</td>
            {% if company.following %}
                <td align="center"><span class="glyphicon glyphicon-star"></span></td>
            {% else %}
                <td></td>
            {% endif %}

            <!--HAS ARTICLE(S) FLAG -->
            {% if article in company.articles.all %}
                <td align="center"><span class="glyphicon glyphicon-list-alt"></span></td>
            {% else %}
                <td>Blank</td>
            {% endif %}

            <td nowrap="true"><a href="{{ company.website }}" target="_blank">{{ company.website }}</a></td>
            <td nowrap="true">{{ company.address }}</td>
        </tr>
        {% endfor %}
    </tbody>
阿拉斯代尔

在模板中,您可以将外键从公司反向跟踪到其文章或成绩单。

  {{ company }}
  {% for company in company.articles.all %}
    {{ article }}
  {% endfor %}

如果您在详细视图中使用它,则不必方法中设置articles您根本不应该设置- 详细视图会为您执行此操作。transcriptsget_context_datacontext['company']

在列表视图中,您可以循环浏览公司并以相同的方式访问文章和成绩单。

{% for company in company_list %}
  {{ company }}
  {% for company in company.articles.all %}
    {{ article }}
  {% endfor %}
{% endfor %}

这将导致对查询集中的每个公司进行查询。您可以使用prefetch_related.

Company.objects.prefetch_related('articles', 'transcripts')

在您的列表视图中,您可以prefetch_related通过设置使用queryset

class CompanyList(generic.ListView):
    # No need to set model now that you have set queryset
    queryset = Company.objects.prefetch_related('articles', 'transcripts')

如果您只想知道是否有关联的文章或交易,那么您不必预取它们。您可以annotate改为使用查询集:

from django.db.models import Count

# in your view
queryset = Company.objects.annotate(num_articles=Count('article')

然后在您的模板中,您可以访问company.num_articles.

{% if company.num_articles %}
  Company has articles
{% endif %}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用Django Haystack查询第二个模型

来自分类Dev

Django自定义用户添加第二个用户模型

来自分类Dev

使用第二个应用程序中的模型测试Django应用程序

来自分类Dev

在 Django 模板 For 循环中对第二个模型使用键值查找?

来自分类Dev

在Django中,由于第二个(和基于视图的)模型中的FK,无法删除模型实例

来自分类Dev

Django视图忽略第二个参数

来自分类Dev

Django添加第二个静态文件URL

来自分类Dev

Django仅将Model1的一列用作第二个模型的外键

来自分类Dev

Django:通过比较第二个OneToOne相关模型的属性来获取第一个模型的对象

来自分类Dev

将记录从第一个Django模型移至第二个,然后从第一个删除

来自分类Dev

尝试注释MapView并同时加载第二个View Controller

来自分类Dev

Android:View.inflate在屏幕上不显示第二个布局

来自分类Dev

具有2个参数的Django URL模式会误解第二个参数

来自分类Dev

Django 在返回第一个请求之前执行第二个请求

来自分类Dev

从Django注册表单中删除第二个密码输入

来自分类Dev

在第二个数据库上的Django调用存储过程

来自分类Dev

如何从Django访问第二个站点(site_id = 2)

来自分类Dev

Django Queryset:如何在queryset中打印第二个值?

来自分类Dev

Django {{forloop.counter}}目标第二个对象

来自分类Dev

从Django注册表单中删除第二个密码输入

来自分类Dev

在第二个数据库上的Django调用存储过程

来自分类Dev

无法将第二个模板加载到我的Django项目中

来自分类Dev

第二个if块在Django模板文件中不起作用

来自分类Dev

如何在我的Django项目中添加第二个表单?

来自分类Dev

如果您在项目中的一个应用程序中使用 AbstractUser 扩展 Django 中的用户模型,您如何从第二个应用程序引用它?

来自分类Dev

寻找第二个最接近价值的指数

来自分类Dev

从第二个斜杠获取价值

来自分类Dev

单击第二个中的链接时,第一个选项卡中放弃了Django会话

来自分类Dev

如何实时检查django view的运行过程

Related 相关文章

  1. 1

    用Django Haystack查询第二个模型

  2. 2

    Django自定义用户添加第二个用户模型

  3. 3

    使用第二个应用程序中的模型测试Django应用程序

  4. 4

    在 Django 模板 For 循环中对第二个模型使用键值查找?

  5. 5

    在Django中,由于第二个(和基于视图的)模型中的FK,无法删除模型实例

  6. 6

    Django视图忽略第二个参数

  7. 7

    Django添加第二个静态文件URL

  8. 8

    Django仅将Model1的一列用作第二个模型的外键

  9. 9

    Django:通过比较第二个OneToOne相关模型的属性来获取第一个模型的对象

  10. 10

    将记录从第一个Django模型移至第二个,然后从第一个删除

  11. 11

    尝试注释MapView并同时加载第二个View Controller

  12. 12

    Android:View.inflate在屏幕上不显示第二个布局

  13. 13

    具有2个参数的Django URL模式会误解第二个参数

  14. 14

    Django 在返回第一个请求之前执行第二个请求

  15. 15

    从Django注册表单中删除第二个密码输入

  16. 16

    在第二个数据库上的Django调用存储过程

  17. 17

    如何从Django访问第二个站点(site_id = 2)

  18. 18

    Django Queryset:如何在queryset中打印第二个值?

  19. 19

    Django {{forloop.counter}}目标第二个对象

  20. 20

    从Django注册表单中删除第二个密码输入

  21. 21

    在第二个数据库上的Django调用存储过程

  22. 22

    无法将第二个模板加载到我的Django项目中

  23. 23

    第二个if块在Django模板文件中不起作用

  24. 24

    如何在我的Django项目中添加第二个表单?

  25. 25

    如果您在项目中的一个应用程序中使用 AbstractUser 扩展 Django 中的用户模型,您如何从第二个应用程序引用它?

  26. 26

    寻找第二个最接近价值的指数

  27. 27

    从第二个斜杠获取价值

  28. 28

    单击第二个中的链接时,第一个选项卡中放弃了Django会话

  29. 29

    如何实时检查django view的运行过程

热门标签

归档