Django多个领域之间的关系

时间:2011-04-27 02:08:47

标签: python django django-models

如果有人能够如此善良,我只需要一点帮助就可以思考。

class object_a(models.Model):
  foo = models.blah
  bar = models.blah

class object_b(models.Model):
  foop = models.blah
  barp = models.blah

在另一个模型中,我有一个类,我希望与这两个字段有一个关系。例如,在管理员中我想要一个可以在某种关系中选择的object_a和object_b对象的列表。

我知道某种类型的通用关系可以做到这一点,我只是不能完全达到尽头。所有的帮助表示赞赏。

感谢。

1 个答案:

答案 0 :(得分:3)

使用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个对象并检查它们:

>>> 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对象。使用泛型关系时,将外键存储到此内容类型条目(标识关系另一端的对象类型)以及模型实例的唯一ID。 generic.GenericForeignKey字段未存储在数据库中,而是一个包装器,它接受内容类型和对象ID并为您检索实际对象。