Django与Django管理员的泛型关系

Django与Django管理员的泛型关系,django,django-models,generic-relationship,Django,Django Models,Generic Relationship,我有一个Django项目,它有一个“地址”模型。这在几个地方都有使用——通过“用户配置文件”模型、“医院”模型、“机构”模型等 我使用Django的泛型关系来允许这些对象中的每一个创建一个外键来寻址 然而,这似乎在Django管理员中引起了一些奇怪的现象(或者我没有正确理解它的用途)。在Django管理员中,如果我尝试创建一个地址,我会看到“内容类型”和“对象id”字段。如果未填充,则模型将不会验证/保存。不知道该放什么进去 问题是,我希望能够创建独立的地址对象。然后,当我创建用户配置文件或医院

我有一个Django项目,它有一个“地址”模型。这在几个地方都有使用——通过“用户配置文件”模型、“医院”模型、“机构”模型等

我使用Django的泛型关系来允许这些对象中的每一个创建一个外键来寻址

然而,这似乎在Django管理员中引起了一些奇怪的现象(或者我没有正确理解它的用途)。在Django管理员中,如果我尝试创建一个地址,我会看到“内容类型”和“对象id”字段。如果未填充,则模型将不会验证/保存。不知道该放什么进去

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

我应该如何使用Django admin和泛型关系

此外,我还打算使用django reversion进行模型的版本控制,不确定这是否会导致泛型关系和管理问题

干杯, 胜利者

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

根据这里给出的答案,这就是为什么地址模型是带有外键的。由于普通FK场只能指向一种类型的对象,所以我们使用泛型关系

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

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

因此,从用户/部门/医院到地址都是一对多


在最初的问题中,他们还建议使用抽象类,并为每个需要地址的实体使用不同的地址模型。我仍然不确定这是不是更好的方法,或者是否有一种方法可以使泛型关系与我在这里尝试做的事情相配合。

在django中使用泛型关系正是这样。一个
ForeignKey
到ContentType(content\u type)和一个
IntegerField
表示实例id(object\u id)。如果您不知道
ForeignKey
指向的是哪种类型的内容,这些功能非常有用。因为您知道您的目标是
地址
模型,所以希望使用常规
外键(地址)
而不是通用关系

回应您的评论

实际上,使用
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()
你的模特会分享地址吗?i、 e.
医院
机构
以及可能的
用户档案
是否都指向同一地址实例?还是更可能每个人都有自己的地址?我试图理解您为什么创建了一个单独的类
地址
。如果要避免在每个类中重新键入相同的字段,可以使用抽象模型类并将其子类化。或者您可能需要一个
OneToOneField
,它是两个实例之间的双向指针


heya,嗯,我认为从设计的角度来看,应该将FK字段放在Address对象上,并将其链接到每个需要地址的对象(用户、医院、机构等)。但是,由于需要为此指定类型,所以我使用泛型关系。然而,如果我把FK字段放在另一个对象上,这不是破坏了设计,还是破坏了ORM?干杯Victor@victorhool我认为@Czarchic是对的,对于你的描述,最好的解决方法是一个“models.ForeignKey(Address)”,既不会破坏设计也不会破坏ORM,不管怎样,如果你坚持使用泛型关系,请阅读文档,在其中放置FK取决于哪一边是“多”。用户/医院/机构是否可以有多个地址?然后,FK应该位于地址上,指向用户/医院/机构。但是,如果一个地址可以属于多个其他对象,那么您希望“其他对象”上的FK指向地址。@卡尔·迈耶是的,要求之一是每个通用对象(用户配置文件、医院、机构等)有多个地址。此外,这些地址可以共享。@victorhooi如果您需要每个对象有多个地址,每个地址有多个对象(共享地址),而不需要重复地址,那么您不需要FKs,您需要很多。并且没有GenericManytomy,尽管您可以通过手动创建中介模型来伪造它。