两个相关模型的 Django 查询

Posted

技术标签:

【中文标题】两个相关模型的 Django 查询【英文标题】:Django Query for two related models 【发布时间】:2020-01-11 04:02:51 【问题描述】:

我有一个与 Booking 模型相关的 Order 模型作为 ForeignKey 字段。所以,一个Order可以关联多个Booking对象。

class Order(models.Model):
    shop=models.ForeignKey(Shop, on_delete=models.CASCADE, blank=True, null=True)
    user=models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING, blank=True, null=True)
    order_id=models.CharField(max_length=100, blank=True, unique=True, default=uuid.uuid4)
    order_date=models.DateField(default=date.today)

class Booking(models.Model):
    order=models.ForeignKey(Order, on_delete=models.CASCADE, blank=True, null=True)
    service=models.ForeignKey(Service, on_delete=models.CASCADE, blank=True, null = True)

我的目标是向Order 展示相关的Booking 对象,如下所示:

<ul>
% for order in orders %
    <li> order.order_id </li>
    <ul>
         % for booking in BOOKINGS WITH THIS ORDER ID %
         <li> booking.service </li>
         % endfor %
    </ul>
% endfor %
</ul>

在模板中,对于每个订单,我希望能够循环使用该订单 ID 进行预订。

我无法弄清楚如何进行正确的查询以在模板中实现这一点。

我想过创建一个字典对象来存储和传递相关的预订对象详细信息,但这似乎不是正确的方法。

def shopDashboardPastBookings(request):
    orders = Order.objects.filter(shop_id = shopID ).exclude(order_date__gte = (datetime.now() - timedelta(days=1)) )
    bookings = 
    for order in orders:
        booking_query = Booking.filter(order = order )
        bookings[order.order_id] = booking_query 

    // should I be making separate queries for each orders like this?

    paginator = Paginator(orders, 10)
    page = request.GET.get('page')
    paged_orders = paginator.get_page(page)
    context = 
    'orders':paged_orders,
    'bookings':bookings,
    
    return render(request, 'dashboard-pastbookings.html',context)

【问题讨论】:

【参考方案1】:

首先,prefetchorders' 在初始查询中的预订以保存数据库命中:

orders = Order.objects.filter(...).exclude(...).prefetch_related('booking_set')

不需要将预订检索到视图中的单独上下文变量。然后,在模板中,只需通过 FK 的默认 related_name 访问特定订单的预订:

% for booking in order.booking_set.all %  

【讨论】:

以上是关于两个相关模型的 Django 查询的主要内容,如果未能解决你的问题,请参考以下文章

按外键/相关字段分组 django 查询集

Django - 查询:使用相关模型字段注释查询集

django中的相关模型查询

Django 开发框架学习

Django 开发框架学习

如何获取与传递给 Django 模板的查询集相关的查询集对象