扩展Django模型类(m2m)2级
好的,我知道标题听起来很混乱,但实际上很简单。考虑这一点:扩展Django模型类(m2m)2级,django,django-models,Django,Django Models,好的,我知道标题听起来很混乱,但实际上很简单。考虑这一点: 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
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)
所以,现在我想用其他字段扩展A的所有实例。例如,对于通过B可用的A的每个实例,我需要一个与其关联的整数
有没有一个简单的方法可以做到这一点
编辑:
我认为这可以看作是从C到B中a实例的一对多关系的定义,如果这有意义的话…如果需要用另一个字段扩展a的所有实例,请添加另一个字段 对于每个a到B都需要一个字段的示例场景,请使用a到模型
根据您的问题标题,我想您是在问一个关于C的问题(您没有提到)实例a是否可以同时附加到B&C?不太可能,这就是我遇到这个问题的原因。。。这是模型的简化版本。实际上,我在B类中有更多的外键(大部分是一对多的)。因此B是一种所有东西的集合点,就像配置文件定义一样。虽然在所有这些外键中,只有一个需要像这样扩展。对不起,如果这个问题让人困惑,我只是很难解释它。但是是的,它是关于C.B不需要添加额外的信息,是C需要这些额外的信息。所以我认为C是非常罕见的,你想分离C-B-A数据吗?如果您需要每个C-A实例之间的数据,那么您唯一的选择是C-A中的另一个m2m字段,一些存储
b.A_元素.all()
id及其关联值的规范化字段,或者b.A_元素上的一个额外字段。通过yes类似的方式,尽管我看不到将此告诉Django的方法。。。我提出的唯一解决方案是:类D,它有这个额外的字段,然后从C我对这个新的类D做一对多。当C启动时,类D实例会自动创建(当时我知道我需要多少)。缺点是我不能(轻松地)从一个表中看到所有相关的D实例……听起来你的想法会创建两个额外的表。C->FKD,D->m2m A。为什么不C->m2m A。那是一张额外的桌子a\u实例。通过\u model\u foreignkey\u set.all()
==具有特殊整数列的所有a-C m2m模型select_related()
访问C实例不需要额外的查询。我只是希望避免重复链接,因为C已经是m2m,A通过B。换句话说:一些A实例链接到B的特定实例。B的特定实例链接到C的实例。所以A和C之间的链接已经存在,我只需要在每个链接上添加一个额外的字段。现在,如果我理解正确,我会做另一个从C到A的m2m链接(通过有这个额外整数的D)。这种方法重复了A-B-C链接,但其他任何解决方案也会重复。所以我想我只需要确保我的代码保持完整性。谢谢
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.