从 OnetoOne 在 Django 中检索和显示 ManyToMany 字段 Class

Retrieving and Displaying a ManyToMany field in Django from a OnetoOne Class

我试图在 Django 中显示用户可以 'heart' 的树列表,但我没有运气。

models.py

from django.db import models
from django.contrib.auth.models import User


class Tree(models.Model):

    treeId = models.IntegerField(primary_key=True)
    neighbourhood = models.CharField(max_length=128,blank=True)
    commonName = models.CharField(max_length=128, blank=True)
    diameter = models.FloatField(blank=True)
    streetNumber = models.PositiveSmallIntegerField(blank=True)
    street = models.CharField(max_length=128, blank=True)



class UserProfile(models.Model):
    # This line is required. Links UserProfile to a User model instance.
    user = models.OneToOneField(User)


    # Tree field is used to store user's favourite trees
    tree = models.ManyToManyField(Tree, blank=True)

views.py

@login_required
def favourites(request):

    current_user = UserProfile.objects.get(id=request.user.id)
    tree_list = current_user.tree.all()
    context_dict = {'trees' : tree_list}
    return render(request, 'hug/favourites.html', context_dict)

favourites.html

            {% for tree in trees %}
            <p>tree id   -   {{ tree.treeId }}</p>
            <p> {{ tree.commonName|title }}</p>
            {% endfor %}

我试过打印语句,它似乎不喜欢这行代码:tree_list = current_user.tree.all()(因为它不打印任何东西)当我 运行 服务器上的代码时,我得到:

UserProfile matching query does not exist.

如有任何建议,我们将不胜感激。

谢谢,

一个

您的代码存在一些问题。

首先,Tree 模型将主键定义为 IntegerField,而不是 AutoField。这意味着它不会自动分配 id;因此,当您尝试添加新树时,您可能会遇到 IntegrityError。除非有充分的理由,否则你应该省略这个字段并让 Django 定义它自己的自动 id。

其次,您获取 UserProfile 的代码是错误的。您正在尝试获取 ID 与当前用户 ID 相同的 UserProfile。假设 User 和 UserProfile 中的 ID 相同;没有理由这样假设。这几乎可以肯定是您收到 "does not exist" 错误的原因:您正在查找错误的 ID。

从用户获取 UserProfile 的正确方法是:

user_profile = request.user.userprofile

但是,我会质疑您为什么需要 UserProfile 模型。它唯一包含的是 ManyToManyField;既然在关系的哪一边定义这些关系没有区别,为什么不把它放到 Tree 中并直接与 User 建立关系呢?这避免了整个查找并极大地简化了问题。那么你可以这样做:

tree_list = request.user.tree.all()