使用3个不同的表左联接-Django

时间:2018-12-04 16:49:56

标签: python 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)

我如何加入表格以显示所有文章,并标明特定用户的特定突出显示?

1 个答案:

答案 0 :(得分:0)

在较新版本的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,以告诉您是否应突出显示它。

另一方面,您的模型定义似乎存在一些问题。 Highlight.article当前是Law的forefore键,而我认为这应该是Article的外键。