Как получить доступ к объекту дочернего класса, который наследует родительский класс?

#python #django #class

#python #django #класс

Вопрос:

У меня есть родительский класс и дочерний класс, который наследует родительский класс. И это нормально, я могу выполнить итерацию с помощью цикла for. Теперь я хочу получить доступ к дочернему классу (пример: ‘product_type’ Так что, по сути, я не понимаю, как мы наследуем материал от дочернего класса внутри того же цикла…

views.py

 from django.views import generic
from . models import Category
from django.shortcuts import render

class CategoryListView(generic.ListView):
    model = Category
    template_name = 'category_list.html'
 

models.py

 from django.db import models
import uuid
    
class Category(models.Model):
    name = models.CharField(max_length=100, help_text='Category name')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'Categories'
    
class Product(models.Model):
    product_name = models.CharField(max_length=255, help_text='Product name')
    # product_spec = models.TextField(max_length=5000, help_text='Product specs')
    product_type = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.product_name
 

category_list.html

 {% extends 'base.html' %}


{% block body %}

{% for page in category_list %}
    <li>{{ page.name }}</li>
    <li>{{ page.product_name }} # <--------------- Now this is the point of 
                                                   #my problem, I want to get 
                                                   #product name from child 
                                                   #class 
                                                   #this returns empty <li>
{% endfor %}

{% endblock %}
 

Ответ №1:

вы можете для этого

 {% extends 'base.html' %}


{% block body %}

{% for page in category_list %}
    <li>{{ page.name }}</li>
    <li>{{ page.product_set.first.product_name }} 
product name from child class, this returns empty <li>
{% endfor %}

{% endblock %}
 

Комментарии:

1. page.product_set.first.product_name не решает внутреннюю проблему, заключающуюся в том, что их будет несколько продуктов одной категории

Ответ №2:

Прежде всего измените свое product_type имя так category , чтобы его было проще понять, и добавьте related_name к нему атрибут следующим образом:

 class Product(models.Model):
    name = models.CharField(max_length=255, help_text='Product name')
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, related_name='products')
 

затем в вашем шаблоне

 {% for category in category_list %}
    {{ category.name }}
    {% for product in category.products.all %}
        {{ product.name}}
        ... other product data
    {% endfor %}
{% endfior %}
      
 

Комментарии:

1. Да, это должно сработать, просто убедитесь, что вы включили related_name атрибут и переименовали поля в соответствии с моим ответом.

2. Они заблокировали меня от вопроса, лол. Чудаки! Кстати, я нашел другой способ сделать это. К сожалению, ваш способ не сработал. Мой следующий шаг, идущий глубже, я хочу напечатать экземпляры (отделенные от остальных продуктов), например: — page1.html содержит только модели телефонов — page2.html содержит только модели наушников … и т.д. Есть какие-нибудь советы?

3. добавьте Category модель и добавьте к ней внешний ключ a Product , затем создайте несколько категорий и назначьте им продукты, затем отфильтруйте продукты по соответствующей категории

Ответ №3:

product_type in Product — это a ForaignKey , что означает, что у них будет несколько продуктов, имеющих одинаковое Category значение, поэтому у них существует два решения

  1. сделайте product_type в Product ключе один к одному, при этом вы должны получить одно имя с помощью {{ page.product.product_name }}
  2. распечатать список всех товаров категории, вы можете сделать это путем итерации page.product_set , поскольку это список (итерируемый) с циклом for.

Комментарии:

1. Установление взаимосвязи OneToOne означало бы, что в 1 категории может быть только 1 продукт, а этого не должно быть.

2. @SLDem Я не знаю бизнес-логики; мой ответ включает в себя оба случая.

3. @SLDem Хорошо, у меня есть «Наушники для телефонов», но это все, я не понимаю, как это называется…

4. прочитайте мой ответ, я переименовал поле в Product модели

5. @SLDem я знаю, просто скопировал ваш код, но все равно не показываю все, что должен. Это безумие