回顾我的Django模型 - 需要很多建议

时间:2009-12-01 22:49:02

标签: django django-models coding-style python

我正在提取各种信息来源以建立一个人的个人资料。一旦我这样做,我希望能够灵活地以不同的方式看待一个人。我在django中没有太多的空洞,所以我想对我的模型进行批评(温柔)。不可否认,即使我编码这个,我也在考虑裁员(反对DRY),但我想知道其他人的想法。 FWIW - 这个数据没有被创建 - 所以也许我不应该保留所有数据,但丢弃数据似乎很糟糕..

具体来说,我想知道ManyToMany的使用是否合适,或者您是否只是KISS,并且在没有任何ManyToMany业务的情况下将每个条目保留为自己的条目。从长远来看,我认为KISS会简单地更新它(一个基本的循环),但是能否查询一个人(比如基于location_description或job_function)是一种权衡。无论如何,我会很感激一些输入。

class Person(models.Model):

    """This simply builds a notes user"""

    aliases = models.ManyToManyField(Aliases)  #Hmm this is list..
    assistant = models.CharField(max_length = 255, blank = True)
    cell_phone = models.CharField(max_lenth = 16, blank = True)
    city = models.ManyToManyField(City)
    country = models.ManyToManyField(County)
    department = models.ManyToManyField(Department)
    departmeht_number = models.ManyToManyField(Department_Number)
    division_code = models.ManyToManyField(Division_Code)
    email = models.EmailField(max_length = 50)
    functional_area = models.ManyToManyField(Functional_Area)
    # jpeg = models.
    job_classification = models.ManyToManyField(Job_Classification)
    job_classification_code = models.ManyToManyField(Job_Classification_Code)
    last_name = models.CharField(max_length = 255)
    location_description = models.ManyToManyField(Location_Description)
    location_path = models.ManyToManyField(Location_Path)
    mail_address = models.CharField(max_length = 255, blank = True)
    mail_domain = models.ManyToManyField(Mail_Domain)
    mail_file = models.CharField(max_length = 255, blank = True)
    mail_server = models.ManyToManyField(Mail_Server)
    match_pct = models.CharField(max_lenth = 6)
    name = models.CharField(max_length = 255)
    name_reverse = models.CharField(max_length = 255)
    nickname = models.CharField(max_length = 32)
    notes_url = models.URLField()
    #    object_class = models.
    office_phone = models.CharField(max_length = 255, blank = True)
    other_phone = models.CharField(max_length = 255, blank = True)
    position = models.ManyToManyField(Position)
    section = models.ManyToManyField(Section)
    section_code = models.ManyToManyField(SectionCode)
    shift = models.ManyToManyField(Shift)
    state = models.ManyToManyFiedl(State)
    supervisor = models.ManyToManyField(Supervisor)
    supervisor_reverse = models.ManyToManyField(Supervisor_reverse)
    uid = models.CharField(max_length = 128)

    def __unicode__(self):
        return str(self.name)

5 个答案:

答案 0 :(得分:5)

__unicode__应返回unicode

def __unicode__(self):
       return u'%s' %self.name

Django提供完整地址的电子邮件地址:

mail = models.EmailField()

我认为,地址模型可能是满满的。一个人可以有几个地址(工作,家庭......)

修改

我刚看到,您正在使用电子邮件地址。

这是为了什么:

mail_address = models.CharField(max_length = 255, blank = True)
mail_domain = models.ManyToManyField(Mail_Domain)
mail_file = models.CharField(max_length = 255, blank = True)
mail_server = models.ManyToManyField(Mail_Server)

<强>吗

修改

您不必一直使用ManyToManyFields。查看ForeignKey,OneToOneField和通用框架

答案 1 :(得分:4)

在我看来,许多ManyToMany关系应该被目标模型的属性所取代。

例如,您已将citycountry视为单独的关系。这意味着您最终可能会遇到city = ['Paris', 'London', 'New York']country = ['USA', 'France', 'UK']

的用户

相反,我认为您应该设置一个locations ManyToMany关系,指向包含citycountry属性的模型。

departmentdepartment_numberjob_classificationjob_classification_codelocation_descriptionlocation_path等相同。

编辑:在某些情况下,您可以使用ForeignKey而不是ManyToMany。用户可能只属于一个citycountry

Positionsupervisor可能是一些比较棘手的关系,因为position应该指向某个部门/单位而is_supervisor应该是某个职位的属性。也就是说,您只需要指向一个位置,因为将从其他用户的位置检索主管。

修改:示例:如果A人在部门X工作,而B人也在部门X工作,但作为经理,则A人由B人监督。

编辑:可能很容易假设某个部门只能有一个经理或者经理只能管理一个部门。我建议反对这一点,因为组织经常有各种特殊情况。考虑一下经理离开公司的情况,部门会暂时没有经理或者其他经理会暂时接管,从而保留两位经理职位。

答案 2 :(得分:2)

我会制作从属字段并删除主管。

 subordinates = models.ManyToManyField('self', related_name='supervisors', through=Position)

这样主管将成为一个自动反向查询字段,并且会有一个连接主管与下属的位置记录

编辑:实际上我还建议您仔细考虑重新设计模型。也许你不需要你建议的那么多。

看起来你有“部门”,“公司”(如果你需要跟踪多家公司),“位置”,“位置”和“人”......决定要保留哪些大实体,然后想一想究竟在哪里每个字段都属于以及如何链接将转换为表格的“大”对象。

最好在位置对象之间建立从属 - 主管关系,因为人来人往,但位置更永久。所以我有:

class Position:
    title = models.CharField() #product manager, engineer, etc.
    employee = models.ForeignKey(Person, related_name='positions')
    subordinates = models.ManyToManyField('self', related_name='supervisors')

如果您不需要每个位置有多个主管,请使用

    supervisor = models.ForeignKey('self', related_name='subordinates')

即使现在没有subordiantes字段,也可以通过相关名称访问它。

地点属于哪里?

如果你认为人员和部门都必须有位置,那么你可能会想到通用关系,虽然不像“常规关系”那样容易使用,但你也可以通过添加“类型”来逃避location('private / business')然后使用Location.company或Location.residence_owner并避免使用泛型关系。

答案 3 :(得分:2)

以下是一些想法。

我认为您应该为departmentjob_classification创建单独的模型,依此类推。例如

class department(models.Model):
    name = Models.CharField(max_length=100)
    number = Models.IntegerField

然后有一个ManyToManyField到部门。否则,如果您有department = ['HR', 'Finance']department_number = [12, 5]的人,我认为没有办法告诉哪个部门编号代表哪个部门。

如果字段按照描述的内容进行分组,而不是按字母顺序排序,我会发现模型更容易阅读。 E.G我认为namenicknamelast_name应该一起定义。

最后,也许Alias应该是一个单独的模型,ForeignKeyPerson,因为只有一个人应该有任何特定的别名。

答案 4 :(得分:1)

我还建议您使用单独的模式进行就业。使用外键返回Person对象。您可以根据需要向该表添加任意数量的记录。

同样的建议也适用于mail_ *字段。