[英]Left Join using 3 different tables - django
我必须出示所有有关法律的文章。 除此之外,如果将文章设置为在数据库中标记为( is_marked
),则必须在本文下划线。 为此,我需要进行左连接,这意味着我必须显示所有文章,并且如果该文章被标记,我需要知道在view
上加下划线。 必须为每个用户指定此标记。
我的view
:
def details(request, pk):
law = get_object_or_404(Law, pk=pk)
articles = Article.objects.filter(law=pk)
context = {
'articles': articles,
}
template_name = 'leis/details.html'
return render(request, template_name, context)
我的detail.html
:
<div class="article-post">
{% for article in articles %}
{{article}}
{% endfor %}
</div>
那是我的model
:
class Law(models.Model):
name = models.CharField('Name', max_length=100)
description = models.TextField('Description', blank = True, null=True)
class Article(models.Model):
article = models.TextField('Artigo/Inciso')
number = models.IntegerField('Number', blank=True, null=True)
law = models.ForeignKey(Law, on_delete=models.CASCADE, verbose_name='Law', related_name='articles')
此类随特定用户在特定法律中的特定文章中突出显示的内容一起保存:
class Highlight(models.Model):
law = models.ForeignKey(Law, on_delete=models.CASCADE, verbose_name='Law', related_name='highlightArticles')
article = models.ForeignKey(Law, on_delete=models.CASCADE, verbose_name='Artigo', related_name='highlightLaw')
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='highlightUsers', related_name='highlightUsers')
is_marked = models.BooleanField('Is it marked?', blank=True, default=False)
description = models.TextField('Description', blank = True, null=True)
如何加入表格以显示所有文章,并标明特定用户的特定突出显示?
在较新版本的Django中,您可以在其他查询中执行子查询。 如果当前用户已突出显示文章,则假设您要在文章下划线,请尝试以下操作:
from django.db.models import Exists, OuterRef
articles = (
Article
.objects
.filter(law=pk)
.annotate(
is_marked=Exists(
Highlight
.objects
.filter(
article_id=OuterRef('id'),
user=request.user
)
)
)
)
这样,我们为每篇文章执行子查询(不必担心性能,数据库引擎会对此进行很好的优化),以检查是否存在与文章和当前用户匹配的Highlight对象。
现在,此is_marked
文章都将包含一个额外的布尔成员is_marked
以告诉您是否应突出显示它。
另一方面,模型定义似乎存在一些问题。 Highlight.article
目前是Law
重要关键,但我认为这应该是Article
的外键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.