python - 如何简单有效地为对象建模用户特定信息?
问题描述
作为示例,我将使用以下代码,显示类似于堆栈溢出的“问题”,以及用户特定信息,例如,已为帖子加注星标。
class Question(models.Model):
title = models.CharField(max_length=200)
body = models.CharField(max_length=2000)
class Star(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
starred = models.BooleanField()
现在的目标是创建所有(或最后 20 个)问题的列表,并在此概览中向用户显示他们已加注星标的问题。
如何处理不好的问题?(X)
为什么在牙膏中使用 Fluroid?( )
沃尔多在哪里?(X)
这取决于当前登录的用户。
创建列表是直截了当的,但添加布尔值似乎相当笨拙或效率低下,而在直接 SQL 中,这可以表示为左外连接(只需用 false 填充不存在的值)。
我试过了:
- 选择相关不能使用,因为并非所有问题都有星号条目
- 由于无法在方法调用上使用参数,因此无法在模板中反转关系
- 循环列表并使用 .get() 添加辅助信息
所以我想知道是否有一种简单的方法来处理这种模式?编辑:答案似乎是:不,没有简单的方法,但接受的答案帮助我找到了解决方案(谢谢)。
注意:为了清楚起见,我重写了问题。请记住,我是 Django 的初学者,可能错过了一些关键的简单事情。
改写问题后,我意识到它类似于实现一个赞按钮:Django Like Button
解决方案
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Question, Star
class StarredQuestionsView(LoginrequiredMixin, View):
def get(self, request):
starred_questions = Star.objects.filter(owner=request.user).filter(starred=True)
return render(request, "app/list-of-starred-questions.html", {'starred_questions': starred_questions})
这应该为您提供所有用户加星标问题的查询集。在您看来,您可以执行以下操作:
{% for question in starred_questions %}
<ul>
<li>{{ question.question.title }}</li>
</ul>
{% endfor %}
希望这能让你走上正确的道路。
推荐阅读
- javascript - 三个结构相同的路径之一的 Node.JS 不起作用
- java - 字符串 *list* 的休眠映射(以字符串为键)
- svelte - 如何在 Sapper 中设置基本标签 href 属性?
- mariadb - 使用 DMS 迁移 MariaDB 数据以排除旧记录并减少 RDS 大小
- c# - AutoMapper 版本 9.0.0 - IMappingOperationOptions 上没有 ConfigureMap() 方法
- java - 调用未知类的方法
- mysql - 带有单列表的 MySQL 错误 1064
- c# - 带有共享库的 C# 字符串
- python - XOR 带有键的消息:TypeError: 'int' object is not callable
- spring-cloud-stream - spring cloud dataflow kubernetes 部署 pass 属性