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

标签 database django django-models django-templates 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')

属性:

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')

所以我已经正确设置了 Django 模型来表示这些表。现在我需要完成的是一个 View 和模板来遍历这些表,以便它生成以下格式的 xml 文档:

<contacts>
    <contact>
        <contactId></contactId>
        <firstName></firstName>
        <lastName></lastName>
        <attributes>
            <attribute>
                <attributeId></attributeId>
                <attributeValue></attributeValue>
            </attribute>
        </attributes>
    </contact>
</contacts>

因此会有一个包含所有联系人以及与每个联系人关联的所有属性的列表。

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

感谢任何人提供的帮助。

最佳答案

假设您已将 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 })

或者,保存一些查询;

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 })

模板

<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>

关于database - Django 模型加入一对多关系以在模板中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5111591/

相关文章:

java - 如何识别从多个提要中收集的重复项并将其链接到数据库中

python - Django 管理员 : automatically generate multiple inlines with the same model

django - select_related 与反向外键

python - 在 Django 中更改模型会导致数据库损坏?

数据库设计 : ordered many-to-many relationship

php - 带IP的每日投票系统

sql - 多对多链表设计: two foreign keys only or an additional primary key?

android - 按日期排序房间结果为字符串

python - Django MongoDB 引擎 DebugCursor "not JSON serializable"

python - Django 记录器在级别 : error and info 之间混合