假设某公司有员工。每个员工都有绑定的姓名和联系信息。每个联系人都包含街道和电话字段。 我想要的是一个列出公司内员工的页面。但一切都必须列为表格。因为我希望能够修改特定的员工信息而且最重要的是 - 我希望能够添加新的员工(点击按钮"添加新员工"必须添加新的空"员工形式&#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很棒。但是,如果您的模型需要动态更改,该怎么办?没有标准的方法去。没有适当的文件也没有找到一个。因此,我想听听专家如何想象这个问题的解决方案。
答案 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.street
和employee.phones
。 employee.contact
是多余的。