簡體   English   中英

如何簡單有效地為對象的用戶特定信息建模?

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

我試過了:

  • 選擇相關無法使用,因為並非所有問題都帶有星號
  • 由於無法在方法調用中使用參數,因此無法反轉模板中的關系
  • 循環列表並使用.get()添加輔助信息

所以我想知道是否有一種簡單的方法來處理這種模式? 編輯: 答案似乎是:不 ,沒有簡單的方法,但是被接受的答案幫助我達成了解決方案(謝謝)。

注意:為了清楚起見,我重寫了這個問題。 請記住,我是Django的初學者,可能錯過了一些關鍵的簡單事情。

改寫問題后,我意識到它類似於實現一個like按鈕: Django Like Button

根據您編輯的問題的新答案:

這種“解決方案”是一種猜測。 因此,請嘗試一下。 它可能無法完全按照書面規定工作,或者有效的解決方案可能超出了我現在能想到的范圍。

  1. 收集所有問題
  2. 將問題減少到您要向用戶顯示的問題
  3. 創建一個僅包含2的已加星標問題的獨立查詢集。
  4. 在每個問題2中添加一個人工屬性,該屬性表示您需要在每個問題后加上“ X”的信息
  5. 將更改后的查詢集獲取到模板

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
  1. 循環提問
  2. 顯示問題
  3. 如果存在人工屬性,則添加“ X”,並且為True

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM