与Django Admin的Django通用关系

时间:2010-01-19 04:50:22

标签: django django-models generic-relationship

我有一个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与我在这里尝试的工作一起工作。

1 个答案:

答案 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()

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