2011-04-27 64 views
0

我只是需要一点点的帮助来思考这一点,如果有人可以如此善良。Django多个字段之间的联系

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对象的列表。

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

谢谢。

回答

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 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并为您检索实际对象的包装器。

+0

嗨布莱尔,这当然清除了如何在API中做到这一点。在总体意义上来看。但是有没有办法在管理员中表示这种类型或关系?再次感谢。 – jduncan 2011-04-27 13:32:08

+0

看着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

相关问题