2015-06-13 4 views
0

Я пытаюсь отобразить список деревьев, которые пользователь может «сердцем» в Django, и мне не повезло.Извлечение и отображение поля ManyToMany в Django из класса OnetoOne

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. 

Любой совет будет очень признателен.

Спасибо,

ответ

0

Есть несколько проблем с вашим кодом.

Во-первых, модель дерева определяет первичный ключ как IntegerField, а не AutoField. Это означает, что он не будет автоматически выделять идентификаторы; поэтому вы, вероятно, получите IntegrityError при попытке добавить новые деревья. Если для этого нет веской причины, вы должны опустить это поле и позволить Django определить свой собственный автоматический идентификатор.

Во-вторых, ваш код, чтобы получить UserProfile, неверен. Вы пытаетесь получить UserProfile, идентификатор которого совпадает с идентификатором текущего пользователя. Это предполагает, что идентификаторы в User и UserProfile одинаковы; и нет оснований предполагать это. Это почти наверняка, почему вы получаете ошибку «не существует»: вы ищете неправильный идентификатор.

Правильный способ получить UserProfile от пользователя, делая:

user_profile = request.user.userprofile 

Однако, я бы вопрос, почему вам нужна модель UserProfile вообще. Единственное, что он содержит, это ManyToManyField; и так как не имеет значения, с какой стороны отношений вы определяете их, почему бы не поместить его в Дерево и не сделать отношения напрямую с пользователем? Это позволяет избежать всего поиска и упрощает проблему. Тогда вы сможете:

tree_list = request.user.tree.all() 
+0

Спасибо, сэр. Это сделал трюк. Я использовал: 'tree_list = request.user.userprofile.tree.all()'. Мне пришлось сохранить UserProfile, так как есть другие атрибуты, которые я не включил в этот пост. И в отношении treeId - мы вытаскиваем внешний набор данных, поэтому treeId - это их уникальный ключ, но я обязательно буду помнить об этом в будущем. Еще раз спасибо. –

Смежные вопросы