两个相关模型的 Django 查询
Django Query for two related models
我有一个 Order
模型作为 ForeignKey 字段与 Booking
模型相关。因此,一个 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)
首先,prefetch 个订单在初始查询中的预订以保存数据库命中:
orders = Order.objects.filter(...).exclude(...).prefetch_related('booking_set')
不需要将预订检索到视图中的单独上下文变量。然后,在模板中,只需通过 FK 的默认 related_name
:
访问特定订单的预订
{% for booking in order.booking_set.all %}
我有一个 Order
模型作为 ForeignKey 字段与 Booking
模型相关。因此,一个 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)
首先,prefetch 个订单在初始查询中的预订以保存数据库命中:
orders = Order.objects.filter(...).exclude(...).prefetch_related('booking_set')
不需要将预订检索到视图中的单独上下文变量。然后,在模板中,只需通过 FK 的默认 related_name
:
{% for booking in order.booking_set.all %}