为什么我无法访问Django模板中的外键信息。

2024-04-19 10:37:40 发布

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

我正在开发一个django应用程序,它需要创建XML文件来响应请求。我的模型设置如下:

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models


class Color(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    name = models.CharField(db_column='Name', unique=True, max_length=255)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_Colors'

    def __str__(self):
        return "Color: [" + self.id.__str__() + ", " + self.name + "] "


class Company(models.Model):
    orders = models.ManyToManyField('Order', through='OrderCompany')
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    name = models.CharField(db_column='Name', max_length=255, blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_Companies'

    def __str__(self):
        return "Company:[" + self.orders.__str__() + ", " + self.id.__str__() + ", " + self.name + "] "


class ModelColor(models.Model):
    color = models.ForeignKey(Color, models.DO_NOTHING, db_column='ColorID')
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_ModelColors'

    def __str__(self):
        return "ModelColor:[" + self.color + ", " + self.id.__str__() + "] "


class ModelData(models.Model):
    colors = models.ManyToManyField('Color', through='ModelDataColor')
    sizes = models.ManyToManyField('Size', through='ModelDataSize')
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    name = models.CharField(db_column='Name', max_length=255)  # Field name made lowercase.
    descript = models.CharField(db_column='Descript', max_length=2047, blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_ModelData'

    def __str__(self):
        return "ModelData:[" + self.colors.__str__() + ", " + self.sizes.__str__() + ", " + self.id.__str__() + ", " + self.name + ", " + self.descript + ", " + "] "


class Modeldatacolor(models.Model):
    model_data = models.ForeignKey(ModelData, models.DO_NOTHING, db_column='ModelDataID', primary_key=True)
    color = models.ForeignKey(Color, models.DO_NOTHING, db_column='ColorID')

    class Meta:
        managed = False
        db_table = 'Data_ModelDataColors'
        unique_together = (('model_data', 'color'),)

    def __str__(self):
        return "Modeldatacolor:[" + self.model_data.__str__() + ", " + self.color.__str__() + "] "


class Modeldatasize(models.Model):
    model_data = models.ForeignKey(ModelData, models.DO_NOTHING, db_column='ModelDataID', primary_key=True)
    size = models.ForeignKey('Size', models.DO_NOTHING, db_column='SizeID')

    class Meta:
        managed = False
        db_table = 'Data_ModelDataSizes'
        unique_together = (('model_data', 'size'),)

    def __str__(self):
        return "Modeldatasize:[" + self.model_data.__str__() + ", " + self.size.__str__() + "] "

class Modelsize(models.Model):
    color = models.ForeignKey(ModelColor, models.DO_NOTHING, db_column='ColorID')
    size = models.ForeignKey('size', models.DO_NOTHING, db_column='SizeID')
    amount = models.IntegerField(db_column='Amount')  # Field name made lowercase.
    amountfinished = models.IntegerField(db_column='AmountFinished')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_ModelSizes'

    def __str__(self):
        return "Modelsize:[" + self.color.__str__() + ", " + self.size.__str__() + ", " + self.amount+ ", " + self.amountfinished + "] "


class Model(models.Model):
    model_color = models.ForeignKey(ModelColor, models.DO_NOTHING, db_column='ModelColorID')
    order = models.ForeignKey('Order', models.DO_NOTHING, db_column='OrderID')
    model_data = models.ForeignKey(ModelData, models.DO_NOTHING, db_column='ModelDataID')
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_Models'

    def __str__(self):
        return "Model:[" + self.model_color.__str__() + ", " + self.order.__str__() + ", " + self.model_data.__str__() + ", " + self.id.__str__() + "] "


class Ordercompany(models.Model):
    order = models.ForeignKey('Order', models.DO_NOTHING, db_column='OrderID', primary_key=True)
    company = models.ForeignKey(Company, models.DO_NOTHING, db_column='CompanyID')
    stage_number = models.IntegerField(db_column='StageNumber')

    class Meta:
        managed = False
        db_table = 'Data_OrderCompanies'
        unique_together = (('order', 'company'),)

    def __str__(self):
        return "Ordercompany:[" + self.order.__str__() + ", " + self.company.__str__() + ", " + self.stage_number + "] "

class Order(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    ordertimestamp = models.DateTimeField(db_column='OrderTimeStamp', blank=True, null=True)  # Field name made lowercase.
    finishtimestamp = models.DateTimeField(db_column='FinishTimeStamp', blank=True, null=True)  # Field name made lowercase.
    name = models.CharField(db_column='Name', max_length=255)  # Field name made lowercase.
    confirmed = models.IntegerField(db_column='Confirmed')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_Orders'

    def __str__(self):
        self.ordertimestamp = "None"
        self.finishtimestamp = "None"
        return "Order:[" + self.id.__str__() + ", " + self.ordertimestamp + ", " + self.finishtimestamp + ", " + self.name + ", " + self.confirmed.__str__() + "] "

class Size(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    name = models.CharField(db_column='Name', unique=True, max_length=255)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Data_Sizes'

    def __str__(self):
        return "Size: [" + self.id.__str__() + ", " + self.name + "] "

我称之为创建模板,如下所示:

def index(request):
    template = loader.get_template('orders/responseTemplate.xml')
    company = Company.objects.get(id=10)  # remember to use `get` for a single item
    order_list = company.orders.all()
    tpcontext = {'orderList': order_list}
    return HttpResponse(template.render(tpcontext, request))

我使用的模板文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<orders>
    {% for order in orderList %}
    <order id="{{ order.id }}">
        <models>
        {% for model in order.model_set.all %}
        <model id="{{ model.id }}">
            <name>{{model.model_data.name}}</name>
            {% for color in model.model_color_set.all %}
            <color name="'{{color.color.name}}'">
                {% for size in color.modelsize_set.all %}
                <sizeAmount name="'{{size.size.name}}'">{{size.amount}}</sizeAmount>
                {% endfor%}
            </color>
            {% endfor%}
        </model>
        {% endfor %}
        </models>
    </order>
    {% endfor %}
</orders>

我想做的是得到关于某个公司的信息(在本例中是身份证号为10的公司)并获得它的所有订单。在这之后,我想为每个订单获得一个模型列表。在我有了一个模型列表之后,我想在屏幕上显示模型名称,然后我想遍历与每个模型相关联的颜色列表,并将其添加到XML文件中的模型中。最后,每种颜色都有一些大小字段,这些字段应添加到各自的颜色中。我得到的输出如下:

<?xml version="1.0" encoding="UTF-8"?>
<orders>

    <order id="16">
        <models>

        <model id="17">
            <name>Pants</name>

        </model>

        <model id="18">
            <name>Pants</name>

        </model>

        </models>
    </order>

</orders> 

如你所见,我可以得到一个模型的列表,还有模型的名字。但是,这些颜色不会出现在列表中。我已经检查了数据库中是否有信息,信息是否存在。你知道吗

我认为模板中的这行有一个错误:

{% for color in model.model_color_set.all %}

但是我不知道这个错误是什么?你知道吗


Tags: nameselfidtruefielddbmodelmodels
3条回答

您的模型在model和ModelColor之间定义了一个ForeignKey。这意味着每个模型只有一个modelcolor。这里没有_set,也没有可迭代的内容;您可以按照外键获取该模型的单一颜色。您可以使用with标记使其更易于使用。你知道吗

    <model id="{{ model.id }}">
        <name>{{model.model_data.name}}</name>
        {% with model.model_color as color %}
        <color name="'{{color.color.name}}'">
            {% for size in color.modelsize_set.all %}
            <sizeAmount name="'{{size.size.name}}'">{{size.amount}}</sizeAmount>
            {% endfor%}
        </color>
        {% endwith %}

你试过model.modelcolor_set.all吗? Django在将CamelCase模型名转换为小写时不添加下划线。你知道吗

Model和ModelColor之间有一对一的关系,所以使用set是没有意义的。你知道吗

看起来您可能试图访问的是ModelData模型的颜色集。你可以这样做:

{% for model in order.model_set.all %}
    <model id="{{ model.id }}">
    <name>{{model.model_data.name}}</name>
    Colors:
    {% for color in model.model_data.colors_set.all %}
        {{ color.name }}
    {% endfor %}
{% endfor %}

相关问题 更多 >