首页 > 解决方案 > 如何简单有效地为对象建模用户特定信息?

问题描述

作为示例,我将使用以下代码,显示类似于堆栈溢出的“问题”,以及用户特定信息,例如,已为帖子加注星标。

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 填充不存在的值)。

我试过了:

所以我想知道是否有一种简单的方法来处理这种模式?编辑:答案似乎是:不,没有简单的方法,但接受的答案帮助我找到了解决方案(谢谢)。

注意:为了清楚起见,我重写了问题。请记住,我是 Django 的初学者,可能错过了一些关键的简单事情。

改写问题后,我意识到它类似于实现一个赞按钮:Django Like Button

标签: pythondjangodjango-modelsdjango-orm

解决方案


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 %}

希望这能让你走上正确的道路。


推荐阅读