【问题标题】:How to access child class object that inherits parent class?如何访问继承父类的子类对象?
【发布时间】:2021-01-12 13:45:34
【问题描述】:

我有父类和子类,继承父类。没关系,我可以使用 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 %}

【问题讨论】:

    标签: python django class


    【解决方案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 %}
    

    【讨论】:

    • 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 %}
          
    

    【讨论】:

    • 是的,这必须工作,只要确保包含related_name 属性并根据我的回答重命名字段。
    • 他们阻止我提问,哈哈。怪人!顺便说一句,找到了另一种方法来做到这一点。不幸的是,你的方法没有奏效。我的下一步更深入,我想打印实例(与其他产品分开),例如: - page1.html 仅包含手机型号 - page2.html 仅包含耳机型号...等等 有什么建议吗?
    • 添加Category 模型并在Product 上添加外键,然后创建一些类别并将产品分配给它们,然后使用各自的类别过滤产品
    【解决方案3】:

    product_typein Product 是一个ForaignKey,这意味着它们将是具有相同Category 的多个产品,因此它们存在两种解决方案

    1. Product 中设置product_type 一对一键,这样你就可以得到{{ page.product.product_name }} 的单一名称

    2. 打印该类别所有产品的列表,您可以通过迭代 page.product_set 来完成此操作,因为它是一个带有 for 循环的列表(可迭代)。

    【讨论】:

    • 建立OneToOne 的关系意味着 1 个类别只能有 1 个产品,而事实并非如此。
    • @SLDem 我不知道业务逻辑;我的回答包括这两种情况。
    • @SLDem 好的,我得到了“Phones Earphones”,但仅此而已,我不知道它的名字......
    • 阅读我的答案,我在 Product 模型上重命名了字段
    • @SLEm 我知道,刚刚复制了你的代码,但仍然没有显示它应该显示的所有内容。这太疯狂了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多