2014-09-29 5 views
4

Мне нужно получить столбцы из нескольких таблиц, как мне это достичь?Django: Получить конкретные столбцы из нескольких таблиц

UserLog 


+------------+----------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+------------+----------+------+-----+---------+----------------+ 
| log_id  | int(11) | NO | PRI | NULL | auto_increment | 
| time  | datetime | NO |  | NULL |    | 
| ip_address | char(15) | YES |  | NULL |    | 
| event_id | int(11) | NO | MUL | NULL |    | 
| user_id | int(11) | NO | MUL | NULL |    | 
+------------+----------+------+-----+---------+----------------+ 

Events 


+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| event_id | int(11)  | NO | PRI | NULL | auto_increment | 
| description | varchar(200) | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

Это мой models.py

class Events(models.Model): 
     event_id = models.AutoField(primary_key=True,verbose_name="Event id") 
     description = models.CharField(max_length=200,verbose_name="Description") 

     def __unicode__(self): 
       return u"%d : %s" % (self.event_id, self.description) 

class UserLog(models.Model): 
     log_id = models.AutoField(primary_key = True) 
     user = models.ForeignKey(User) 
     event = models.ForeignKey(Events,verbose_name = "event") 
     time = models.DateTimeField(default=datetime.now,blank=True) 
     ip_address = models.IPAddressField(null=True) 


     def __unicode__(self): 
       return u"%s (%s): %s" % (self.log_id, self.user, self.event) 

Spcifically Я хочу сделать SELECT log_id,time,user_id,event_id,description from UserLog,Events where UserLog.event_id = Events.event_id

Я попытался UserLog.objects.filter(event_id__event_id).values('log_id','time','user_id','event_id','description'). Но в нем нет таких полей.

Есть ли что-то, что нужно изменить в классе моделей?

+0

Вы можете разместить свое Джанго код модели? – Greg

+0

Что такое 'LogEvents'? – Greg

+0

К сожалению, это должно было быть «События». Обновлено! – theblackpearl

ответ

2

Попробуйте это:

UserLog.objects.filter(event_id=1).values('log_id', 
              'time', 
              'user_id', 
              'event_id', 
              'event__description') 

Кроме того, вы можете использовать select_related:

UserLog.objects.filter(event__id=1).select_related('event') 

, то вы получите UserLog объекты, с событие предварительно задано, поэтому вы можете получить доступ к событию без запуска другой запрос.

(Кроме того, стандарт именование было бы назвать модель Event, не Events)

+0

Это сработало! Достаточно тупой, я забыл получить доступ к другим табличным полям 'foreignkey_fields'. Благодаря :) – theblackpearl

0

использование select_related() так:

UserLog.objects.filter(event_id__event_id=1).select_related('event').values('log_id','time','user_id','event_id', 'event__description') 
+0

Это было быстро! Я попробовал этот 'UserLog.objects.filter (event_id__event_id = 1) .select_related ('описание') значения()' И я получил '[{ 'log_id':. 4L, u'event_id ': 1л , 'ip_address': u'10.100.32.142 ', u'user_id': 2L, 'time': datetime.datetime (2014, 9, 25, 21, 29, 28, tzinfo = )} ' 'Описание' поле не отображается! – theblackpearl

+0

Вы правы, я пытался неправильно обращаться к полям из других таблиц. – theblackpearl

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