Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展Django模型类(m2m)2级_Django_Django Models - Fatal编程技术网

扩展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.