Python 如何简单高效地为对象建模特定于用户的信息?
作为一个例子,我将使用以下代码,显示一个类似于堆栈溢出的“问题”,以及特定于用户的信息,例如,在文章中加了星号Python 如何简单高效地为对象建模特定于用户的信息?,python,django,django-models,django-orm,Python,Django,Django Models,Django Orm,作为一个例子,我将使用以下代码,显示一个类似于堆栈溢出的“问题”,以及特定于用户的信息,例如,在文章中加了星号 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=m
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个)问题的列表,并在此概述中向用户显示他们所关注的问题
如何处理糟糕的问题?(十)
为什么在牙膏中使用氟利昂?()
沃尔多在哪里?(十)
这取决于当前登录的用户
创建列表很简单,但添加布尔值似乎相当笨拙或低效,而在direct SQL中,这可能表示为左外部联接(只需用false填充不存在的值)
我试过:
- 无法使用“选择相关”,因为并非所有问题都有带星号的条目
- 由于无法在方法调用上使用参数,因此无法在模板中反转关系
- 循环列表并使用.get()添加辅助信息
重新表述问题后,我意识到这类似于实现一个like按钮:基于编辑的问题的新答案: 这个“解决方案”只是一个猜测。所以请尝试一下。它可能无法完全按照所写的那样工作,或者有效的解决方案可能超出了我现在所能想到的范围
questions=Question.objects.all()
#现在限制你的结果
#我假设“问题”会减少到你想要展示的结果的数量
星号问题=问题.过滤器(星号集所有者=请求.用户,星号集星号=真)
有关问题:
question.starred=星号问题中的问题
#现在就让“问题”进入你的观点
{%用于问题中的问题%}
{{问题}(
{%if question.starred%}
X
{%endif%}
)
{%endfor%}
我希望这种方法能帮助你实现你的目标
旧答案: 基于 我想显示所有As的列表,并为用户显示关联的Bs 这句话我想你的观点是特定于用户的?这意味着如果用户X访问该视图,该用户会看到自己的值,如果用户Y访问该视图,他们会再次看到自己的值
all_b_of_user=request.user.b_set.all()。选择与_相关的('a')
select\u related
获取同一查询中的所有数据,以减少查询计数,从而缩短响应时间
另一方面,如果您希望在某种概述上显示所有用户的所有值(允许某些用户Z查看X和Y的所有值),则需要创建尽可能多的数据库查询,因为据我所知,您有用户。根据您编辑的问题得出新答案:
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})
这个“解决方案”只是一个猜测。所以请尝试一下。它可能无法完全按照所写的那样工作,或者有效的解决方案可能超出了我现在所能想到的范围
questions=Question.objects.all()
#现在限制你的结果
#我假设“问题”会减少到你想要展示的结果的数量
星号问题=问题.过滤器(星号集所有者=请求.用户,星号集星号=真)
有关问题:
question.starred=星号问题中的问题
#现在就让“问题”进入你的观点
{%用于问题中的问题%}
{{问题}(
{%if question.starred%}
X
{%endif%}
)
{%endfor%}
我希望这种方法能帮助你实现你的目标
旧答案: 基于 我想显示所有As的列表,并为用户显示关联的Bs 这句话我想你的观点是特定于用户的?这意味着如果用户X访问该视图,该用户会看到自己的值,如果用户Y访问该视图,他们会再次看到自己的值
all_b_of_user=request.user.b_set.all()。选择与_相关的('a')
select\u related
获取同一查询中的所有数据,以减少查询计数,从而缩短响应时间
另一方面,如果您希望在某种概述上显示所有用户的所有值(允许某些用户Z查看X和Y的所有值),则需要创建尽可能多的DB查询,因为据我所知,您有用户
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 %}
{%用于带星号的问题%}
- {{question.question.title}
{%endfor%}
希望这能让你走上正确的道路
这将为您提供一个用户所有带星号问题的查询集。在你看来,你可以