我有一个使用3个表的查询。 law
,article
和marked
。
我有一个网站,用户可以在其中选择一个law
来阅读所有articles
。对于每篇文章,用户都可以对其进行标记或输入对此文章的一些描述。
marker
和description
保存在marked
表中。因此,当用户再次打开法律时,将会加载他所有的标记和说明。
问题是我的查询中不知道如何显示登录用户的描述和标记。我的查询中显示了在标记表中注册的所有用户的描述和标记。
已标记表格内容的示例:
id is_marked description article_id law_id user_id
"0" "0" "test1" "1100" "3" "1"
"1" "0" "test2" "1102" "3" "1"
如果我使用law = 3
访问user_id =2
,则将显示user_id = 1
的所有描述。
我的查询:
law = get_object_or_404(Law, pk=pk)
articles = Article.objects.filter(law=pk)
articles = (
Article
.objects
.filter(law=pk)
.annotate(
is_marked=Exists(
Marked
.objects
.filter(
article_id=OuterRef('id'),
usuario=request.user,
is_marked=1,
)
)
)
.annotate(
description=(F('markedLaw__description'))
).order_by('id')
我的模特:
class Law(models.Model):
name = models.CharField('Nome', max_length=100)
description = models.TextField('Description', blank = True, null=True)
class Article(models.Model):
article = models.TextField('Article')
id_article_law = models.IntegerField('Article Law', blank=True, null=True)
law = models.ForeignKey(Law, on_delete=models.CASCADE, verbose_name='Law', related_name='Articles')
class Marked(models.Model):
law = models.ForeignKey(Law, on_delete=models.CASCADE, verbose_name='Law', related_name='markedArtigos')
Article = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name='Article', related_name='markedLaw')
usuario = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='markedUsuario', related_name='markedUsuario')
is_marked = models.BooleanField('Está Marcado?', blank=True, default=False)
description = models.TextField('Descrição', blank = True, null=True)
答案 0 :(得分:1)
您可以创建模板标签过滤器,该过滤器将接收登录的用户和文章并过滤标记的模型。
在这种情况下,您将在模板级别处理它,而无需做注释。
这里是参考:https://docs.djangoproject.com/en/2.1/howto/custom-template-tags/