django: 需要为 'multiple level nested' 结构设计 models/forms

django: need to design models/forms for a 'multiple level nested' structures

假设某公司有员工。每个员工都有绑定的姓名和联系信息。每个联系人都包含街道和电话字段。 我想要的是一个列出公司内部员工的页面。但一切都必须列为表格。因为我希望能够修改特定的员工信息,最重要的是 - 我希望能够添加新员工(单击按钮 "Add new employee" 必须添加一个新的空 "Employee form")。此外,它必须允许随时向现有员工的联系信息添加新的 phone 号码。 数据模型如下所示:

--Company
----Employee1
------Name
------Contact
--------Street
--------Phones
----------Phone1
----------Phone2
----Employee2
------Name
------Contact
--------Street
--------Phones
----------Phone1
----------Phone2
----------Phone3
...

有人可以帮助设计模型和表单来完成这样的任务吗?非常感激你的帮助。非常感谢!

P.S。忘记提及我想要在一天结束时 Company 对象中的所有数据 "collected"。我的意思是当我在后端序列化 c = Comapany.objects.all()[0] 时,整个员工信息必须是可见的,比如 c.employees[0].contact.phones[0] 必须是第一位员工的第一个 phone 号码。谢谢。

P.P.S。 那不是我只是转发我的项目。这只是我为展示问题而创建的一个假设示例。我是 Django 的新手,正试图了解框架如何让事情顺利进行。 我在这上面花了很多时间。我找到了几种方法,但没有人让我走到尽头。例如,关于嵌套表单集的精彩博客 http://yergler.net/blog/2013/09/03/nested-formsets-redux/ helped with forms and rendering. But, it solved only the half of the problem. The data like I mentioned above is not "being collected" into an object. At the end of the day I want to serialize a Company object and save it in yaml format using pyyaml (see my previous post django: want to have a form for dynamically changed sequence data)。 Django 非常适合 "static" 模型和表单,ModelForms 很棒。但是,如果您的模型需要动态更改怎么办?没有标准的方法可走。要么没有合适的文件,要么我找不到。因此,我想听听专家们如何设想解决此类问题的方法。

试试这个:

from django.db import models


class _Contact(object):
    pass


class Company(models.Model):
    name = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

    @property
    def employees(self):
        return self.employee_set.prefetch_related('phones').order_by('-created_at')


class Phone(models.Model):
    number = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)


class Employee(models.Model):
    name = models.CharField(max_length=255)
    street = models.CharField(max_length=255)
    phones = models.ManyToManyField('Phone', through='EmployeePhone', blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    company = models.ForeignKey(Company)

    @property
    def contact(self):
        _contact = _Contact()
        _contact.street = self.street
        _contact.phones = self.phones.order_by('-employeephone__created_at')

        return _contact


class EmployeePhone(models.Model):
    employee = models.ForeignKey(Employee)
    phone = models.ForeignKey(Phone)
    created_at = models.DateTimeField(auto_now_add=True)

但是,您应该只使用 employee.streetemployee.phonesemployee.contact 是多余的。