如何在项目和所有者之间创建关系,其中所有者可以是个人或公司



在我的应用程序中,项目归所有者所有,所有者可以是一个或多个人或公司,但不能同时是两者。 个人和公司是两种不同的模式。 我还想使用通过模型获得所有权来关联一些重要信息,例如所有权日期、处置日期等。

你如何在 Django 中建模? 我正在使用 Postgres 9.1

一种方法

是使用支持"泛型"的内置django.contrib.contenttype应用程序,即可能指向多个模型之一的外键。它非常强大,因为它提供了内联表单等表单元素。

以下是有关泛型的一些资源:

https://docs.djangoproject.com/en/1.9/ref/contrib/contenttypes/#generic-relations-in-adminhttp://screamingatmyscreen.com/2012/6/django-and-generic-relations/

我在自己的项目中使用 django-polymorphic 取得了很大的成功,而且它非常易于使用。

从版本 0.9.2 开始,您可以实现这样的多态模型(直接取自文档):

from polymorphic.models import PolymorphicModel
class Project(PolymorphicModel):
    topic = models.CharField(max_length=30)
class ArtProject(Project):
    artist = models.CharField(max_length=30)
class ResearchProject(Project):
    supervisor = models.CharField(max_length=30)

创建模型:

>>> Project.objects.create(topic="Department Party")
>>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner")
>>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")

获取多态查询结果:

>>> Project.objects.all()
[ <Project:         id 1, topic "Department Party">,
  <ArtProject:      id 2, topic "Painting with Tim", artist "T. Turner">,
  <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]

因此,在您的情况下,您可以设置如下模型:

class Owner(PolymorphicModel):
    date_of_ownership = ...
    date_of_disposal = ...
class Person(Owner):
    pass
class Company(Owner):
    pass
class Item(models.Model):
    owner = ForeignKey(Owner)

最新更新