Django模型加入一对多关系以在模板中显示

Ric*_*ard 3 database django django-templates django-models left-join

不确定描述问题的最佳方法是什么.我有2个表联系和属性.联系表每人有1个条目,属性表每人有0个,1个或多个条目.他们目前加入了一个"假的"外键,这个外键实际上不是外键.如果我需要添加外键,那么处理旧数据并不是什么大问题,原来没有外键.所以表格如下:

联系:

class contact(models.Model):
    contactId = models.AutoField(primary_key=True, db_column='contactId')
    firstName = models.CharField(max_length=255, null=True, db_column='firstName')
    middleName = models.CharField(max_length=255, null=True, db_column='middleName')
    lastName = models.CharField(max_length=255, null=True, db_column='lastName')
Run Code Online (Sandbox Code Playgroud)

属性:

class attribute(models.Model):
    attributeId = models.AutoField(primary_key=True, db_column='attributeId')
    contactId = models.IntegerField(db_index=True, null=True, db_column='contactId')
    attributeValue = models.TextField(null=True, db_column='attributeValue')
Run Code Online (Sandbox Code Playgroud)

所以我已经正确设置了Django模型来表示这些表.现在我需要完成的是一个循环遍历这些表的视图和模板,以便它以下列格式生成一个xml doc:

<contacts>
    <contact>
        <contactId></contactId>
        <firstName></firstName>
        <lastName></lastName>
        <attributes>
            <attribute>
                <attributeId></attributeId>
                <attributeValue></attributeValue>
            </attribute>
        </attributes>
    </contact>
</contacts>
Run Code Online (Sandbox Code Playgroud)

因此,将列出所有联系人以及与每个联系人关联的所有属性.

我确信有一种简单的方法可以实现这一目标.在其他语言中,我会简单地编写两个循环查询来遍历联系人,然后遍历每个联系人的属性.然而,我工作的公司正在迁移到一个新的平台,并希望用django/python编写的新应用程序,我仍在努力学习.

任何人都可以提供任何帮助表示赞赏.

Yuj*_*ita 8

假设您已经设置了django模型以使用当前的数据库设置,如果我没有设置外键,我会执行以下操作.

contacts = Contact.objects.all()

for contact in contacts:
    contact.attributes = Attribute.objects.filter(contactId=contact.pk) 


return render_to_response("mytemplate.html", {'contacts': contacts })
Run Code Online (Sandbox Code Playgroud)

或者,保存一些查询;

attributes_map = dict( 
    [(attribute.contactId, attribute) for attribute in \
        Attribute.objects.filter(contactId__in=[contact.pk for contact in contacts])]
    )

for contact in contacts:
    contact.attributes = attributes_map.get(contact.pk)

return render_to_response("mytemplate.html", {'contacts': contacts })
Run Code Online (Sandbox Code Playgroud)

模板

<contacts>
{% for contact in contacts %}
    <contact>
        <contactId>{{ contact.pk }}</contactId>
        <firstName>{{ contact.firstName }}</firstName>
        <lastName>{{ contact.lastName }}</lastName>

        {% if contact.attributes %}
            <attributes>
            {% for attribute in contact.attributes %}
                <attribute>
                    <attributeId>{{ attribute.pk }}</attributeId>
                    <attributeValue>{{ attribute.attributeValue }}</attributeValue>
                </attribute>
            {% endfor %}
            </attributes>
        {% endif %}

    </contact>
{% endfor %}
</contacts>
Run Code Online (Sandbox Code Playgroud)