2014-01-23 2 views
0

Смотрите некоторые фрагменты пожалуйста:как запросить между несколькими таблицами в Джанго

1.model UserProfile:

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

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    email = models.EmailField(unique=True) 

    HEAD_CHOICE = (
     ('1', 'M'), 
     ('2', 'F'), 
    ) 
    image_id = models.CharField(max_length=2, choices=HEAD_CHOICE, default='2') 

2.Model TimeLine:

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

class TimeLine(models.Model): 
    user = models.ForeignKey(UserProfile) 

views.py 3.TimeLine в

from models import TimeLine 
from django.shortcuts import render_to_response 

def index(request): 
    timelinedict = TimeLine.objects.all() 
    return render_to_response('timeline.html', locals()) 

Вопрос: как я могу сделать var 'timelinedict' содержать поля (image_id, email) UserProfile.

Заранее спасибо :)

+0

Просто предложение (не имеет отношение к вашему вопросу): Если вы хотите получить доступ к внешним ключам элементов таблицы из родительской таблицы QuerySet затем принести родительскую таблицу, используя [select_related] (https://docs.djangoproject.com/ен/DEV/исх/модели/querysets/# выберите связанные). Это позволит сэкономить некоторые удаленные базы данных. – anuragal

ответ

1

Вопрос: как я могу сделать вар 'timelinedict' содержат поля (image_id, email) из UserProfile.

Это уже делает:

from models import TimeLine 
from django.shortcuts import render 

def index(request): 
    timelinedict = TimeLine.objects.all() 
    return render(request, 'timeline.html', {'objects': timelinedict}) 

В timeline.html:

{% for obj in objects %} 
    {{ obj.user.email }} 
    {{ obj.user.image_id }} 
{% endfor %} 
  1. Используйте render ярлык, не render_to_response. render вернет правильный код запроса , что полезно при обработке форм. Лучше всего привыкнуть к использованию render.

  2. Не использовать locals(); потому что вы отправите каждую переменную в свой шаблон. Это никогда не то, что вы хотите. Явный лучше, чем неявный.

+0

работает! ну, не могли бы вы объяснить, почему бы не использовать render_to_response и почему бы не использовать locals() – Zuckonit

+0

Обновлен мой вопрос, надеюсь, теперь его ясно. –

+0

рендеринг - это хорошо, но если я знаю, что я пошлю от locals(), я могу использовать его, потому что это заставляет мой палец чувствовать себя лучше. спасибо – Zuckonit

0

Ваш пример timelinedict не на самом деле dict это queryset содержащие объекты Timeline.

Я думаю, используя декоратор @property, как показано ниже, вы сможете прикреплять атрибуты к объектам модели TimeLine.

class TimeLine(models.Model): 
    user = models.ForeignKey(UserProfile) 

    @property 
    def image_id(self): 
     return self.user.image_id 

    @property 
    def email(self): 
     return self.user.email 

Конечно, вы можете просто получить доступ к ним непосредственно в шаблоне через object.user.image_id и т.д.

1

Вам не нужно делать ничего особенного, вы можете сразу получить доступ к этим атрибутам из экземпляра от TimeLine.

Например

for t in TimeLine.objects.all(): 
    print t.user.image_id, t.user.email 

Аналогично вы можете использовать его в шаблоне, а также.

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