我试图循环一个相关的模型,并在该模型中显示其他属性,其中包括其他关系,但在视图中显示这一点有困难。任何提示都将不胜感激。
# 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='')# 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)# 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 %}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 | barSample preferred output assuming q = o
1
lorem: info-1
ipsum: info-2
2
foo: info-1What actually happens assuming q = o
1
lorem:
ipsum:
2
foo: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这是对实际数据集的简化,但希望有足够的数据集。如果你有任何问题,请告诉我。提前谢谢。
更新
经过多次调整和尝试德尼兹·卡普兰的建议后,我设法让它发挥作用。我唯一做的调整是:
results = Model1.objects.filter(model1__value__icontains=q).distinct('id')为了提高效率,这里有一个小小的修改:
results = Model1.objects.prefetch_related('model1').filter(model1__value__icontains=q).distinct('id')如果这似乎让任何人感到困惑,小写model1表示Model1和Model3 (又名Model3.model1 )之间的关系。
发布于 2020-05-16 02:56:22
在创建了一个示例项目之后,我发现我们首先需要更改的是这个视图:
# 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)然后我就能把作者的信息告诉他们。
# 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部件上,但我认为这对您来说已经足够了。
https://stackoverflow.com/questions/61831210
复制相似问题