首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在视图中显示其他相关模型的Django最佳实践

在视图中显示其他相关模型的Django最佳实践
EN

Stack Overflow用户
提问于 2020-05-16 02:40:56
回答 1查看 90关注 0票数 0

我试图循环一个相关的模型,并在该模型中显示其他属性,其中包括其他关系,但在视图中显示这一点有困难。任何提示都将不胜感激。

代码语言:javascript
复制
# model.py
class Model1(models.Model):
    entry = models.TextField(default='')

class Model2(models.Model):
    info = models.TextField(default='')

class Model3(models.Model):
    model1 = models.ForeignKey(Model1, on_delete=models.CASCADE)
    model2 = models.ForeignKey(Model2, on_delete=models.CASCADE)
    value = models.TextField(default='')
代码语言:javascript
复制
# views.py
class IndexView(View):
    def get(self, request, *args, **kwargs):
        q = 'o'
        results = Model1.objects.filter(model3__value__icontains=q).distinct('id')

        context = {
            'results': results,
        }

        return render(request, 'index.html', context=context)
代码语言:javascript
复制
# index.html
{% for result in results %}
  <div>
    <p>{{ result }}</p>
    {% for m in result.model1.all %}
      <p>
        {{ m.value }}: {{ m.model2.info}}
      </p>
    {% endfor %}
  </div>
{% endfor %}
代码语言:javascript
复制
Sample data for Model1:
id | entry
1  | entry-1
2  | entry-2
3  | entry-3

Sample data for Model2:
id | info
1  | info-1
2  | info-2

Sample data for Model3:
id | model1 | model2 | value
1  | 1      | 1      | lorem
2  | 1      | 2      | ipsum
3  | 2      | 1      | foo
4  | 3      | 1      | bar
代码语言:javascript
复制
Sample preferred output assuming q = o
1
lorem: info-1
ipsum: info-2

2
foo: info-1
代码语言:javascript
复制
What actually happens assuming q = o
1
lorem:
ipsum:

2
foo:
代码语言:javascript
复制
Mapping the sample models to a more tangible relationship:
Model1 - Author
Model2 - Language
Model3 - Book

So the goal would be a view showing:
author-1
lorem: language-1
ipsum: language-2

author-2
foo: language-1

这是对实际数据集的简化,但希望有足够的数据集。如果你有任何问题,请告诉我。提前谢谢。

更新

经过多次调整和尝试德尼兹·卡普兰的建议后,我设法让它发挥作用。我唯一做的调整是:

代码语言:javascript
复制
results = Model1.objects.filter(model1__value__icontains=q).distinct('id')

为了提高效率,这里有一个小小的修改:

代码语言:javascript
复制
 results = Model1.objects.prefetch_related('model1').filter(model1__value__icontains=q).distinct('id')

如果这似乎让任何人感到困惑,小写model1表示Model1和Model3 (又名Model3.model1 )之间的关系。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-16 02:56:22

在创建了一个示例项目之后,我发现我们首先需要更改的是这个视图:

代码语言:javascript
复制
# views.py
from django.shortcuts import render
from django.views.generic import View

from book.models import Author


# Create your views here.
class IndexView(View):
    def get(self, request, *args, **kwargs):
        q = 'o'
        author_qs = Author.objects.filter(book__value__icontains=q)
        # this is the part we need to update to group query by author
        query = author_qs.query
        query.group_by = ["id"]

        context = {
            'results': author_qs,
        }

        return render(request, 'index.html', context=context)

然后我就能把作者的信息告诉他们。

代码语言:javascript
复制
# index.html file
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Authors</title>
</head>
<body>
<ul>
{% for author in results %}
    <li>{{ author.entry }}
    <ul>
        {% for book in author.book_set.all %}
          <li>{{ book.value}}: {{ book.language.info }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>
</body>
</html>

我没有花时间在html部件上,但我认为这对您来说已经足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61831210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档