如何扩展 Django Queryset 的 select_related 函数的范围,使其包含与原始 table 相关的 table 相关的 table

How to extend the reach of the select_related function of Django Queryset so it includes the table related to a table related to the original table

这就是我的 models.py 的样子

    class Branches(models.Model):
        def __str__(self):
            return self.location

        location = models.CharField(max_length=256, unique=True)


    class Daily_Infos(models.Model):
        class Meta:
            unique_together = ["date", "branch_id"]

        def __str__(self):
            return str(self.date) + " " + str(self.branch_id)

        branch_id = models.ForeignKey(Branches, related_name='daily_info', on_delete=models.CASCADE)
        date = models.DateField()

    class Branch_Prices(models.Model):
        def __str__(self):
            return str(self.branch_id) + " " + str(self.menu_item_id) + " " + str(self.price)

        branch_id = models.ForeignKey(Branches, related_name='prices', on_delete=models.CASCADE)
        menu_item_id = models.ForeignKey(Menu_Items, related_name='prices', on_delete=models.CASCADE)
        price = models.FloatField()

    class Sold_Menu_Items(models.Model):
        def __str__(self):
            return str(self.branch_price_id) + " " + str(self.daily_info_id) + " " + str(self.quantity)

        daily_info_id = models.ForeignKey(Daily_Infos, related_name='sold_menu_items', on_delete=models.CASCADE)
        branch_price_id = models.ForeignKey(Branch_Prices, related_name='sold_menu_items', on_delete=models.CASCADE)
        quantity = models.IntegerField()

    class Menu_Items(models.Model):
        def __str__(self):
            return str(self.name) + " " + str(self.size)

        name = models.CharField(max_length=256)
        size = models.CharField(max_length=64)
        start_date = models.DateField()
        is_active = models.BooleanField()

在我的views.py中,我有这个功能:

def view_sold_items_all(request):
    sold_menu_items = Sold_Menu_Items.objects.select_related('branch_price_id','daily_info_id')
    refined_sold_menu_items = []
    for smi in raw_sold_menu_items:
        menu_item = []
        menu_item.append(smi.daily_info_id.date)
        menu_item.append(smi.quantity)
        menu_item.append(smi.branch_price_id.branch_id.location)
        menu_item.append(smi.branch_price_id.menu_item_id.name)
        menu_item.append(smi.branch_price_id.menu_item_id.size)

        refined_sold_menu_items.append(menu_item)
    return render(request, 'view_all.html', {
        'sold_items':refined_sold_menu_items
        })

根据我的理解,下面的代码(在我的 views.py 文件中)将允许 Django 只查询我的数据库一次。

sold_menu_items = Sold_Menu_Items.objects.select_related('branch_price_id','daily_info_id')

在for循环中,不会一直查询数据库两行:

menu_item.append(smi.daily_info_id.date)
menu_item.append(smi.quantity)

然而,对于其他三个追加,我认为 Django 仍然查询数据库,因为 select_related 没有涵盖它,因为它与 Sold_Menu_Items table 没有直接关联。

我的问题是,如何使我的代码更有效率?我计划让 Django 只查询一次数据库,这样在 for 循环的三个追加中,它就不需要继续查询我的数据库。我在想也许我可以在 Branch_Prices table 上第二次使用 select_related。但是,我不知道该怎么做,我什至不知道这是否是提高代码效率的正确方法。

我相信我能够回答我自己的问题。这是正确的方法吗?我对 views.py.

进行了一些编辑
def view_sold_items_all(request):
    raw_sold_menu_items = Sold_Menu_Items.objects.select_related(
        'daily_info_id',
        'branch_price_id__branch_id', 
        'branch_price_id__menu_item_id',
    )
    refined_sold_menu_items = []
    for smi in raw_sold_menu_items:
        menu_item = []
        menu_item.append(smi.daily_info_id.date)
        menu_item.append(smi.branch_price_id.branch_id.location)
        menu_item.append(smi.branch_price_id.menu_item_id.name)
        menu_item.append(smi.branch_price_id.menu_item_id.size)
        menu_item.append(smi.quantity)
        refined_sold_menu_items.append(menu_item)
    return render(request, 'view_all.html', {
        'sold_items':refined_sold_menu_items
        })