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.street
和 employee.phones
。 employee.contact
是多余的。
假设某公司有员工。每个员工都有绑定的姓名和联系信息。每个联系人都包含街道和电话字段。 我想要的是一个列出公司内部员工的页面。但一切都必须列为表格。因为我希望能够修改特定的员工信息,最重要的是 - 我希望能够添加新员工(单击按钮 "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.street
和 employee.phones
。 employee.contact
是多余的。