django:需要为“多级嵌套”结构设计模型/表单

时间:2015-01-07 13:36:35

标签: python django

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

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

有人可以帮助为这样的任务设计模型和表单吗?非常感激您的帮忙。非常感谢!

P.S。忘记提到我想要所有数据"收集"在当天结束时的公司对象中。我的意思是当我在后端序列化c = Comapany.objects.all()[0]时,整个员工信息必须是可见的,例如c.employees [0] .contact.phones [0]必须是第一个员工&#39 ;第一个电话号码。谢谢。

P.P.S。 那不是我转发我的项目的情况。这只是我为解决问题而创建的一个假设示例。我是一个django新手,并试图了解框架是如何让事情发生变化的。 我花了很多时间在这上面。我找到了几种方法,但没有人让我走到尽头。例如,关于嵌套表单集http://yergler.net/blog/2013/09/03/nested-formsets-redux/的精彩博客有助于表单和呈现。但是,它只解决了问题的一半。像我上面提到的数据不是"被收集"成对象。在一天结束时,我想序列化一个Company对象,并使用pyyaml以yaml格式保存它(请参阅我之前的帖子django: want to have a form for dynamically changed sequence data)。 Django非常适合"静态"模型和形式,ModelForms很棒。但是,如果您的模型需要动态更改,该怎么办?没有标准的方法去。没有适当的文件也没有找到一个。因此,我想听听专家如何想象这个问题的解决方案。

1 个答案:

答案 0 :(得分:0)

试试这个:

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是多余的。

相关问题