从OnetoOne类中检索和显示Django中的ManyToMany字段

时间:2015-06-13 09:49:43

标签: python django many-to-many one-to-one

我正在尝试显示用户可以“心脏”的树木列表。在Django,我没有运气。

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.

非常感谢任何建议。

谢谢,

A

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

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

其次,获取UserProfile的代码是错误的。您正在尝试获取其ID与当前用户的ID相同的UserProfile。假设User和UserProfile中的ID相同;并且没有理由认为这一点。这几乎可以肯定你得到“不存在”的错误:你正在查找错误的ID。

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

user_profile = request.user.userprofile

但是,我会问你为什么需要UserProfile模型。它包含的唯一内容是ManyToManyField;并且因为你定义那些关系的哪一方没有区别,为什么不将它放入Tree并直接与User建立关系?这避免了整个查找并极大地简化了问题。然后你就可以做到:

tree_list = request.user.tree.all()