使用Django提供的contenttypes framework:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
class Other(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
然后你就可以创建一些你的主要对象:
>>> from myapp.models import object_a, object_b, Other
>>> a = object_a()
>>> a.foo = 'test'
>>> a.bar = 'value'
>>> a.save()
>>> b = object_b()
>>> b.foop = 'random'
>>> b.barp = 'values'
>>> b.save()
然后保存在Other
对象对它们的引用:
>>> o1 = Other()
>>> o1.content_object = a
>>> o1.save()
>>> o2 = Other()
>>> o2.content_object = b
>>> o2.save()
现在如果我们要求所有的Other
o bjects并检查他们:
>>> all = Other.objects.all()
>>> all[0].content_object
<object_a: object_a object>
>>> all[0].content_object.foo
u'test'
>>> all[1].content_object
<object_b: object_b object>
>>> all[1].content_object.foop
u'random'
通过查看Other
对象的领域,我们可以看到Django是如何存储的一般关系:
>>> all[0].content_type
<ContentType: object_a>
>>> all[0].object_id
1
当您运行syncdb
命令来安装你的模型, Django为每个模型创建一个唯一的ContentType
对象。在使用泛型关系时,将外键存储到此内容类型条目(标识关系的另一端是什么类型的对象)以及模型实例的唯一标识。 generic.GenericForeignKey
字段没有存储在数据库中,而是一个包含内容类型和对象ID并为您检索实际对象的包装器。
嗨布莱尔,这当然清除了如何在API中做到这一点。在总体意义上来看。但是有没有办法在管理员中表示这种类型或关系?再次感谢。 – jduncan 2011-04-27 13:32:08
看着http://docs.djangoproject.com/en/dev/ref/contrib/admin/#using-generic-relations-as-an-inline,我需要(或至少渴望)与此相反的管理员。我基本上需要一个由object_a和object_b中的对象内容组成的foreignkey字段 – jduncan 2011-04-27 14:04:00