Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何简单高效地为对象建模特定于用户的信息?_Python_Django_Django Models_Django Orm - Fatal编程技术网

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()添加辅助信息
所以我想知道是否有一种简单的方法来处理这种模式? 编辑:答案似乎是:不,没有简单的方法,但被接受的答案帮助我找到了解决方案(谢谢)

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


重新表述问题后,我意识到这类似于实现一个like按钮:

基于编辑的问题的新答案:

这个“解决方案”只是一个猜测。所以请尝试一下。它可能无法完全按照所写的那样工作,或者有效的解决方案可能超出了我现在所能想到的范围

  • 收集所有问题
  • 将问题减少为您希望向用户显示的问题
  • 创建一个独立的查询集,其中只包含2个带星号的问题
  • 为2的每个问题添加一个人工属性。这表示您需要在每个问题后面加上“X”的信息
  • 将更改后的查询集获取到模板
  • views.py:

    questions=Question.objects.all()
    #现在限制你的结果
    #我假设“问题”会减少到你想要展示的结果的数量
    星号问题=问题.过滤器(星号集所有者=请求.用户,星号集星号=真)
    有关问题:
    question.starred=星号问题中的问题
    #现在就让“问题”进入你的观点
    
  • 反复提问
  • 提出问题
  • 如果人工属性存在且为真,则添加“X”
  • my_template.html:

    {%用于问题中的问题%}
    {{问题}(
    {%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})
    
    这个“解决方案”只是一个猜测。所以请尝试一下。它可能无法完全按照所写的那样工作,或者有效的解决方案可能超出了我现在所能想到的范围

  • 收集所有问题
  • 将问题减少为您希望向用户显示的问题
  • 创建一个独立的查询集,其中只包含2个带星号的问题
  • 为2的每个问题添加一个人工属性。这表示您需要在每个问题后面加上“X”的信息
  • 将更改后的查询集获取到模板
  • views.py:

    questions=Question.objects.all()
    #现在限制你的结果
    #我假设“问题”会减少到你想要展示的结果的数量
    星号问题=问题.过滤器(星号集所有者=请求.用户,星号集星号=真)
    有关问题:
    question.starred=星号问题中的问题
    #现在就让“问题”进入你的观点
    
  • 反复提问
  • 提出问题
  • 如果人工属性存在且为真,则添加“X”
  • my_template.html:

    {%用于问题中的问题%}
    {{问题}(
    {%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%}
    希望这能让你走上正确的道路

    这将为您提供一个用户所有带星号问题的查询集。在你看来,你可以