Django: как получить доступ к косвенным значениям в модели, на два уровня ниже - PullRequest
0 голосов
/ 20 января 2020

Я хотел бы получить доступ к списку значений на два уровня ниже в модели для отображения в шаблоне.

В приведенной ниже модели у вас есть корзина для покупок, в которую можно положить различные виды мяса .

Предположим, вы положили в корзину для покупок два вида мяса: Рибай и Стейк Румпа. Какой уровень белка у каждого из этих двух типов?

Мои модели выглядят так :

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_names  = list(object.meatbasket.values_list('name', flat=True))

Однако как получить доступ к следующему уровню вниз, т.е. в моем примере, чтобы получить количество «белка» для каждого названия мяса?

Ответы [ 2 ]

1 голос
/ 20 января 2020

В качестве подхода к набору запросов вы можете использовать '__' для доступа к полям, которые охватывают отношения. Это описано здесь в документах.

В вашем случае это может быть что-то вроде

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

, возвращающее все названия мяса и соответствующие значения белка в вашем заказе.

1 голос
/ 20 января 2020

Вот простой код Python, который возвращает / печатает значение protein из ShopOrder модель

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

Вы можете сделать то же самое в шаблоне Django также, используя for l oop

{% 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 QuerySet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...