Django Python : Manager isn't accessible via model instances

huangapple go评论102阅读模式
英文:

Django Python : Manager isn't accessible via model instances

问题

我试图查询一个对象集合并使用对象的数量来进行循环,以呈现每个对象的参数。我使用一个二维数组来存储这些参数,以便它们可以与其对象相对应地呈现。我希望不仅提供一个解决方案,还提供一种更好的通用方法。附言:我是django的新手

这是来自views.py的代码:

  1. def flashcard(response):
  2. form = Flashcard_verif(response.POST)
  3. if response.method == "POST" and form.is_valid():
  4. head = form.cleaned_data["header"]
  5. ques = form.cleaned_data["question"]
  6. ans = form.cleaned_data["answer"]
  7. flashcard_data = Flashcard(header=head, question=ques, answer=ans)
  8. # 这是错误发生的地方
  9. flashcard_obj = Flashcard(header=head, question=ques, answer=ans).objects.all()
  10. rawHeader, rawQuestion, rawAnswer = Flashcard(header=head, question=ques, answer=ans).flash_format()
  11. flashcard_data.save()
  12. if len(flashcard_lib) > 1:
  13. for i in range(0, len(flashcard_lib), 1):
  14. flashcard_lib.append([rawHeader, rawQuestion, rawAnswer])
  15. print(flashcard_lib)
  16. return render(response, "main/Flashcard.html", {
  17. "form": form,
  18. "Flashcard_lib": flashcard_lib,
  19. "flashcard": flashcard_obj})
  20. else:
  21. flashcard_lib.append([rawHeader, rawQuestion, rawAnswer])
  22. print(flashcard_lib)
  23. return render(response, "main/Flashcard.html", {
  24. "form": form,
  25. "header": rawHeader,
  26. "question": rawQuestion,
  27. "answer": rawAnswer
  28. })
  29. else:
  30. form = Flashcard_verif()
  31. return render(response, "main/Flashcard.html", {
  32. "form": form})

这是使用二维数组的模板:

  1. <div class="flashcard-view" id="flash" style="visibility: hidden">
  2. {% if Flashcard_lib|length >= 2 %}
  3. {% for i in flashcard_obj %}
  4. <div class="flashcard">
  5. {{ i.0 }}
  6. {{ i.1 }}
  7. {{ i.2 }}
  8. </div>
  9. {% endfor %}
  10. {% else %}
  11. <div class="flashcard">
  12. {{ header }}
  13. {{ question }}
  14. {{ answer }}
  15. </div>
  16. {% endif %}
  17. </div>

当我运行服务器时,我注意到if语句执行了,但for循环没有执行。这有点是一个两全其美的问题,如何让它遍历列表。

英文:

I'm trying to query an object set and use the number of the amount of objects to do a for loop that will present parameters of each object. I'm using a 2D array to store the parameters so they can be presented respective to their object. I would like not just a solution but a better way in general of doing this .p.s. I'm new to django

This is the code from views.py

  1. def flashcard(response):
  2. form = Flashcard_verif(response.POST)
  3. if response.method == &quot;POST&quot; and form.is_valid():
  4. head = form.cleaned_data[&quot;header&quot;]
  5. ques = form.cleaned_data[&quot;question&quot;]
  6. ans = form.cleaned_data[&quot;answer&quot;]
  7. flashcard_data = Flashcard(header=head, question=ques, answer=ans)
  8. # this is where the error is occuring
  9. flashcard_obj = Flashcard(header=head, question=ques, answer=ans).objects.all()
  10. rawHeader, rawQuestion, rawAnswer = Flashcard(header=head, question=ques, answer=ans).flash_format()
  11. flashcard_data.save()
  12. if len(flashcard_lib) &gt; 1:
  13. for i in range(0, len(flashcard_lib), 1):
  14. flashcard_lib.append([rawHeader, rawQuestion, rawAnswer])
  15. print(flashcard_lib)
  16. return render(response, &quot;main/Flashcard.html&quot;, {
  17. &quot;form&quot;:form,
  18. &quot;Flashcard_lib&quot;:flashcard_lib,
  19. &quot;flashcard&quot;:flashcard_obj})
  20. else:
  21. flashcard_lib.append([rawHeader, rawQuestion, rawAnswer])
  22. print(flashcard_lib)
  23. return render(response, &quot;main/Flashcard.html&quot;, {
  24. &quot;form&quot;:form,
  25. &quot;header&quot;:rawHeader,
  26. &quot;question&quot;:rawQuestion,
  27. &quot;answer&quot;:rawAnswer
  28. })
  29. else:
  30. form = Flashcard_verif()
  31. return render(response, &quot;main/Flashcard.html&quot;, {
  32. &quot;form&quot;:form})

This is my template that utilises the 2d array:

  1. &lt;div class=&quot;flashcard-view&quot; id=&quot;flash&quot; style=&quot;visibility: hidden&quot;&gt;
  2. {% if Flashcard_lib|length &gt;= 2 %}
  3. {% for i in flashcard_obj %}
  4. &lt;div class=&quot;flashcard&quot;&gt;
  5. {{ i.0 }}
  6. {{ i.1 }}
  7. {{ i.2 }}
  8. &lt;/div&gt;
  9. {% endfor %}
  10. {% else %}
  11. &lt;div class=&quot;flashcard&quot;&gt;
  12. {{ header }}
  13. {{ question }}
  14. {{ answer }}
  15. &lt;/div&gt;
  16. {% endif %}
  17. &lt;/div&gt;

When i run the server I notice that the if statement executes but the for loop does not. This is kind've a 2 in 1 problem, how do i get it to iterate through the list.

答案1

得分: 0

在以下代码行中:

  1. flashcard_data = Flashcard(header=head, question=ques, answer=ans)

你创建了一个 Flashcard 模型的实例,但没有将其保存到数据库中,要这样做,你需要执行:

  1. flashcard_data.save()

在以下代码行中发生了错误:

  1. flashcard_obj = Flashcard(header=head, question=ques, answer=ans).objects.all()

因为你创建了另一个实例(与上面两行代码中的实例具有相同的数据),然后尝试使用它来获取对象管理器。在 Django 模型实例中,可以表示为:

  • 单个对象(如你的情况)
  • 作为查询集 - 特殊的类似列表的结构,可以为空或包含一个或多个实例。

如果你想获取数据库中的所有 Flashcard 记录,你需要执行:

  1. Flashcard.objects.all()

其中 Flashcard 是你的模型,objects 是对象管理器,它将允许你指定你需要什么:

  • Flashcard.objects.all() - 返回包含所有实例的查询集
  • Flashcard.objects.filter(...) - 返回包含经过筛选的记录的查询集
  • Flashcard.objects.first() - 返回数据库中的第一个对象(而不是查询集!)
    等等。

你不能从实例中调用对象管理器。

英文:

In line

  1. flashcard_data = Flashcard(header=head, question=ques, answer=ans)

You created instance of model Flashcard, but you didnt saved it to db, to do so you need to do:

  1. flashcard_data.save()

An error occured in line

  1. flashcard_obj = Flashcard(header=head, question=ques, answer=ans).objects.all()

because you created another instance (with same data as instance 2 lines above) and then you try to get obj manager with it. In Django model instances can be represented as:

  • single objects (as in your case)
  • As querysets - special list-like structures, empty or containing one or several instances.

If you want to get all Flashcard records in db you need to do

  1. Flashcard.objects.all()

Where Flashcard - is your model, objects - is object manager, that will let you to specify what do you need -
Flashcard.objects.all() - returns queryset with all instases
Flashcard.objects.filter(...) - - returns queryset with filtered records
Flashcard.objects.first() - returns first object (not queryset!) in db
etc..

You cant call obj manager from instance

huangapple
  • 本文由 发表于 2023年7月31日 23:06:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/76804909.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定