3

我有一个 Django 项目,它有一个“地址”模型。这用于多个地方 - “用户档案”模型,“医院”模型,“机构”模型等。

我正在使用 Django 的通用关系来允许这些对象中的每一个创建地址的外键。

然而,这似乎在 Django Admin 中引起了一些奇怪(或者我可能没有正确理解它是如何使用的)。在 Django Admin 中,如果我尝试创建地址,我会看到“内容类型”和“对象 ID”的字段。如果未填写,模型将不会验证/保存。不知道该放什么。

问题是,我希望能够创建独立的 Address 对象。然后,当我创建用户配置文件或医院时,我可以将它们链接到地址对象,包括多个链接到同一个地址对象的可能性。

我应该如何使用具有通用关系的 Django 管理员?

另外,我还打算使用 django-reversion 对模型进行版本控制,不确定这是否会导致通用关系和管理员出现任何问题?

干杯,维克多

编辑:我应该补充一下,这是我之前发布的地址和内联问题:

Django - 设计模型关系 - 管理界面和内联

根据那里给出的答案,这就是为什么 Address 模型是具有外键的模型。由于普通的 FK 字段只能指向一种类型的对象,这就是我们使用泛型关系的原因。

每个用户/部门/医院等可能(并且在大多数情况下)有多个地址。

同一个地址可以被多个实体使用,但这种情况比较少见,而且在这里重复也可以,我猜,对吧?

所以这将是从用户/部门/医院到地址的一对多。

在那个原始问题中,他们还建议使用抽象类,并为每个需要地址的实体使用不同的地址模型。我仍然不确定这是否是更好的方法,或者是否有办法让 GenericRelations 与我在这里尝试做的事情一起工作。

4

1 回答 1

3

在 django 中使用泛型关系正是如此。一个ForeignKey到 ContentType (content_type) 和一个IntegerField来表示实例 id (object_id)。如果您不知道ForeignKey指向的是哪种类型的内容,这些会很有用。既然您知道您的目标是Address要使用常规ForeignKey(Address)而不是通用关系的模型。

回应您的评论

实际上它更容易使用ForeignKey,因为您不需要通过 ContentType。

class Address(models.Model):
  street=models.CharField(max_length=100)
  city=models.CharField(max_length=100)


class Hospital(models.Model):
  name=models.CharField(max_length=100)
  created=models.DateTimeField()
  address=models.ForeignKey(Address, related_name="hospitals")

class Institution(models.Model):
  name=models.CharField(max_length=100)
  address=models.ForeignKey(Address, related_name="institutions")


>>> instance=Institution.objects.get(id=1)
>>> instance.address.city
>>> address=Address.objects.get(id=1)
>>> address.institutions.all() 
>>> address.hospitals.all()

你的模型会共享地址吗?即aHospital和anInstitution或者aUserProfile都可以指向同一个地址实例吗?还是每个人都有自己的地址?我试图理解你为什么创建了一个单独的类Address。如果要避免在每个类中重新输入相同的字段,您可以使用抽象模型类并将其子类化。或者您可能需要一个OneToOneField两个实例之间的双向指针。

于 2010-01-19T04:59:25.497 回答