我有一个Django项目,它有一个“地址”模型。这在几个地方使用 - 通过“用户配置文件”模型,“医院”模型,“机构”模型等。
我正在使用Django的通用关系来允许每个对象创建一个外键来解决。
然而,这似乎在Django Admin中引起了一些奇怪(或者我可能没有正确理解它是如何被使用的)。在Django Admin中,如果我尝试创建一个地址,我会看到“Content type”和“Object id”的字段。如果未填充模型,模型将不会验证/保存。不知道该放什么。
问题是,我希望能够创建独立的Address对象。然后,当我创建用户配置文件或医院时,我可以将这些链接到地址对象,包括链接到同一地址对象的多个链接的可能性。
我应该如何将Django管理员与通用关系一起使用?
另外,我还打算使用django-reversion进行模型的版本控制,不确定这是否会导致泛型关系和管理员的任何问题?
干杯, 维克多
编辑:我应该补充一下,这是我发布地址和内联的早期问题:
Django - Designing Model Relationships - Admin interface and Inline
根据那里给出的答案,这就是为什么Address模型是带有外键的模型。由于普通的FK字段只能指向一种类型的对象,这就是我们使用泛型关系的原因。
每个用户/部门/医院等可能(并且在大多数情况下)会有多个地址。
多个实体可以使用相同的地址,但这种情况比较少见,重复在这里很好,我猜,对吧?
所以它是用户/部门/医院到地址的一对多。
在那个原始问题中,他们还建议使用抽象类,并为每个需要Address的实体使用不同的Address模型。我仍然不确定这是否是更好的方法,或者是否有办法让GenericRelations与我在这里尝试的工作一起工作。
答案 0 :(得分: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()
你的模特会分享地址吗?即,Hospital
和Institution
以及可能UserProfile
是否都指向同一个地址实例?或者更有可能每个人都拥有自己的地址?我试图理解为什么你创建了一个单独的类Address
。如果要避免将相同的字段重新输入到每个类中,您可以使用抽象模型类并将其子类化。或者您可能需要OneToOneField
,这是两个实例之间的双向指针。