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属性的对象。


我不确定是否理解:您的查询会返回SubSubEvent实例,从中您可以访问相关的SubEventEvent实例,然后访问它们的所有属性(例如querySet.first().sub_event.event.cur_datetime等)。 - albar
1个回答

5

您好,看起来您需要使用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

谢谢您的答案,它像应该的一样工作。我只是想知道是否有一种方法可以将qs中包括所有的eventsub_event字段作为单个变量。例如,是否可能使sub_sub_event = qs[0]返回所有字段,包括外键的字段?(在这种情况下,我们可以跳过sub_event = sub_sub_event.sub_eventsub_event = sub_sub_event.sub_event - arrt_
你可能对多表继承感兴趣。 - Sherpa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接