2011-03-23 100 views
0

好的我知道标题听起来很混乱,但它确实很简单。考虑到这一点:扩展Django模型类(m2m)2级别

class A(models.Model): 
    field = models.CharField(max_length=10) 

class B(models.Model): 
    field = models.CharField(max_length=10) 
    a_elements = models.ManyToManyField(A) 

class C(models.Model): 
    field = models.CharField(max_length=10) 
    b_element = models.ForeignKey(A) 

所以,现在我想要的是扩展与其他领域的所有实例。例如,对于通过B可用的每个A实例,我需要一个与其相关的整数。

有没有一个简单的方法来做到这一点?

编辑:

我觉得我们可以看到这是从C到情况下在B A的一个一对多关系的定义,如果是有道理的......

+0

可能实例的,在连接到B&C同一时间? – manji 2011-03-23 14:11:00

+0

不是真的,这就是为什么我有这个问题...这是模型的简化版本。实际上,我在B类中有更多的外键(主要是一对多)。因此,B是一切收集点,如配置文件定义。尽管在所有这些外键中只有一个需要像这样扩展。 – rytis 2011-03-23 14:18:54

回答

0

如果您需要扩展A的所有实例与另一个字段,添加另一个字段。

对于您需要每个A到B的字段的示例场景,请使用直通模型。

http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

class A(models.Model): 
    field = models.CharField(max_length=10) 

class B(models.Model): 
    field = models.CharField(max_length=10) 
    a_elements = models.ManyToManyField(A, through='B_A') 

class C(models.Model): 
    field = models.CharField(max_length=10) 
    b_element = models.ForeignKey(A) 


class B_A(models.Model): 
    """ 
    Custom through model for B.a_elements 
    """ 
    a = models.ForeignKey(A) 
    b = models.ForeignKey(B) 
    integer = models.IntegerField() 


b = B.objects.latest('id') 
ab_elements = B_A.objects.filter(b=b).select_related() 
# these are your m2m intermediary model instances, 
# which are essentially A instances with an extra field. 

for ab in ab_elemements: 
    print ab.a # a element 
    print ab.integer # integer associated with this a element. 

通过你的问题的标题,我想你问一个关于C的问题,但(你没有提到)

+0

抱歉,如果问题很混乱,我只是很难制定它。但是,是的,这是关于C. B不需要添加额外的信息,这是C需要这个额外的信息。 – rytis 2011-03-23 15:02:11

+0

因此,我认为C是不常见的,你想分开C-B-A数据?如果您需要每个C - A实例之间的数据,那么您唯一的选择是来自C - A的另一个m2m字段,某个标准化字段存储'b.a_elements.all()'id和它们的关联值,或者' B.a_elements.through' – 2011-03-23 15:52:52

+0

是的,就像那样,虽然我没有看到这种方式告诉Django ...只有解决方案,我想出了:D类,有这个额外的领域,然后从CI做一对多到这个新的类D. D类实例自动创建,当C启动时(因为那时我知道我需要多少)。缺点是我不能(很容易)从A看到所有相关的D实例...... – rytis 2011-03-24 07:00:57