[英]How to model User specific information for Objects simple and efficiently?
作為示例,我將使用以下代碼,顯示類似於堆棧溢出的“問題”以及用戶特定的信息,例如,已為帖子加注星標。
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的初學者,可能錯過了一些關鍵的簡單事情。
改寫問題后,我意識到它類似於實現一個like按鈕: Django Like Button
根據您編輯的問題的新答案:
這種“解決方案”是一種猜測。 因此,請嘗試一下。 它可能無法完全按照書面規定工作,或者有效的解決方案可能超出了我現在能想到的范圍。
views.py:
questions = Question.objects.all()
# limit your results now
# I assume 'questions' going forward was reduced to the number of results you want to show
starred_questions = questions.filter(star_set__owner=request.user, star_set__starred=True)
for question in questions:
question.starred = question in starred_questions
# get 'questions' to your view now
my_template.html:
{% for question in questions %}
<p>{{ question }}(
{% if question.starred %}
X
{% endif %}
)</p>
{% endfor %}
我希望這種方法將幫助您實現目標。
舊答案:基於
我想顯示所有A的列表,並為用戶顯示相關的B。
我想你這句話是針對用戶的嗎? 就是說,如果用戶X訪問該視圖,那么該用戶將看到他們自己的值,如果用戶Y訪問該視圖,那么他們將再次看到他們自己的值?
all_b_of_user = request.user.b_set.all().select_related('a')
select_related
在同一查詢中獲取所有數據,以減少查詢數量,從而減少響應時間。 doc
另一方面,如果您想在某種概覽中顯示所有用戶的所有值(允許某些用戶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})
這應該為您提供所有用戶已加星標問題的查詢集。 在您看來,您可以執行以下操作:
{% for question in starred_questions %}
<ul>
<li>{{ question.question.title }}</li>
</ul>
{% endfor %}
希望這能使您走上正確的道路。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.