Django 与 Django Admin 的通用关系

标签 django django-models generic-relationship

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

我使用 Django 的通用关系来允许每个对象创建一个指向 Address 的外键。

但是,这似乎会在 Django Admin 中引起一些奇怪的情况(或者也许我没有正确理解它的使用方式)。在 Django 管理中,如果我尝试创建地址,我会看到“内容类型”和“对象 id”字段。如果未填写,模型将不会验证/保存。不知道要在其中放入什么。

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

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

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

干杯, 维克多

编辑:我应该添加,这是我之前发布的地址和内联问题:

Django - Designing Model Relationships - Admin interface and Inline

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

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

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

因此,这将是从用户/部门/医院到地址的一对多。

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

最佳答案

在 django 中使用泛型关系就是这样。 ContentType (content_type) 的 ForeignKey 和表示实例 ID (object_id) 的 IntegerField。如果您不知道 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,它是两个实例之间的双向指针。

关于Django 与 Django Admin 的通用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2091156/

相关文章:

django - 如何遍历 Django 模板中的泛型关系?

python - Django Channels 与 Web 套接字的连接

javascript - Django 管理自定义小部件内联处理添加?

Python Django populate() 不可重入

python - 动态模型的主键

具有未知数量的复选框字段和多个操作的 Django 表单

Django 获取模型的所有相关值

sql - Django 通用关系和 ORM 查询

jquery - 将 JSON 对象从 Python 脚本发送到 jQuery?