Django:如何访问模型中的间接值,向下两级

2024-05-19 18:41:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想访问模型中两级以下的值列表,以便在模板中显示

在下面的模型中,你有一个购物篮,你可以在里面放不同种类的肉

假设你现在在购物篮里放了两种肉,里贝耶和臀部牛排,这两种肉的蛋白质含量是多少

我的模型如下所示:

class ShopOrder(models.Model):
    order_date = models.DateField()
    meatbasket = models.ManyToManyField('food.Meat', blank=True)

# App food
class Meat(models.Model):
    name = models.CharField(max_length=20)
    nutrition  =  models.OneToOneField(Nutrition, blank=True, null=True, on_delete=models.SET_NULL)

class Nutrition(models.Model):
    protein = models.IntegerField()
    fat = models.IntegerField()

我可以在第一层创建一个列表(下面模型“meat”中的“meat”名称列表:

meat_names  = list(object.meatbasket.values_list('name', flat=True))

但是,我如何访问下一个级别,即在我的示例中,获取每个肉类名称的“蛋白质”数量


Tags: name模型true列表modelfoodmodels蛋白质
2条回答

作为一种查询集方法,您可以使用“_u”访问跨越关系的字段。这在文档中有描述

在你的情况下,这可能是

prot_values = shoppingorder.meatbasket.values_list('name', 'nutrition__protein')

返回shoppingorder中的所有肉类名称和相关蛋白质值

下面是从ShopOrder模型返回/打印protein值的普通Python代码

for shop_order in ShopOrder.objects.all():
    for meat in shop_order.meatbasket.all():
        print(meat.nutrition.protein)

您也可以在Django模板中使用^{} loop执行相同的操作

{% for shop_order in shop_order_qs %}
    {% for meat in shop_order.meatbasket.all %}
        Meat Name: {{ meat.name }}
        Protein: {{ meat.nutrition.protein }}
    {% endfor %}
{% endfor %}

shop_order_qs是包含ShopOrder.objects.all()ShopOrder查询集值的上下文变量

相关问题 更多 >