Django在Queryset

时间:2017-05-05 12:53:18

标签: django python-3.x django-models django-queryset

我有3个型号:

class Event(models.Model):
    cur_datetime = models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0, 0, 0, pytz.UTC), blank=True, null=True)
    week_no = models.IntegerField()
    day_no = models.IntegerField()

class SubEvent(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    version = models.IntegerField()

class SubSubEvent(models.Model):
    sub_event = models.ForeignKey(SubEvent, on_delete=models.CASCADE)
    length = models.IntegerField()

我想从SubSubEvent模型中获取Queryset,其中包含所有外键作为单个对象。我现在拥有的是:

querySet = SubSubEvent.objects.filter(sub_event__event__cur_datetime__range=[from_date, to_date])

这将返回一个查询集,并使用for循环在每个对象上获取__dict__,我得到这样的结果:

{'event_id': 1, '_state': <django.db.models.base.ModelState object at 0x7fd7d9cefeb8>, 'id': 10, 'length': '1'}

这只是我想要实现的查询的一部分。我真正想要的是event_id中的所有字段,而不仅仅是id数字。换句话说,在一个查询集中来自EventSubEventSubSubEvent的所有字段(包括数据)。此查询集应包含具有cur_datetime,week_no,day_no,version和length的对象。

1 个答案:

答案 0 :(得分:2)

听起来你正在寻找select_related()

qs = SubSubEvent.objects \
    .select_related('sub_event__event') \
    .filter(sub_event__event__cur_datetime__range=[from_date, to_date])

然后,您可以访问相关的SubEventEvent资源,而无需访问数据库。

sub_sub_event = qs[0]
sub_event = sub_sub_event.sub_event    # doesn't hit the database
event = sub_sub_event.sub_event.event  # doesn't hit the database