【问题标题】:many to many in django-tables2django-tables2 中的多对多
【发布时间】:2015-05-28 05:37:19
【问题描述】:

我通过ForeignKey拥有多对多的django模型:

    class A(m.Model):
        id = m.AutoField(primary_key=True)
        name = m.CharField(max_length=250, unique=True, null=False)

        def __str__(self):
            return self.name


    class B(m.Model):
        id = m.AutoField(primary_key=True)
        name = m.CharField(max_length=250, unique=True, null=False)
        a = m.ForeignKey(A)

        def __str__(self):
            return self.name


    class C(m.Model):
        id = m.IntegerField(null=False, unique=True, primary_key=True)
        name = m.CharField(max_length=250, unique=True, null=False)
        bs = m.ManyToManyField(B, through='D')

        def __str__(self):
            return '%d, %s, (%s), (%s)' % (
                self.id,
                self.name, 
                ', '.join(b.name for b in self.bs.all()), 
                ', '.join(b.a.name for b in self.bs.all()))
                )


    class D(m.Model):
        c = m.ForeignKey(C)
        b = m.ForeignKey(B)

        class Meta:
            unique_together = ('c', 'b')

来自模型 C 的 django-tables2:

class CTable(tables.Table):

    class Meta:
         model = C

观看次数:

def C(request):
    data = C.objects.all()
    c_table = t.CTable(data)
    return render(request, 'c.html', {'c_table': c_table})

在 c.html 中:

...
    {% render_table c_table %}
...

我得到的表只有两列(id、name)而不是四列(id、name、b.name、b.a.name)。 如何从多到多获取缺失的列? 对不起我糟糕的英语。

【问题讨论】:

    标签: python django many-to-many foreign-key-relationship django-tables2


    【解决方案1】:

    在模型中添加一个属性方法,使用table类进行渲染,即:

    模型类

    class C(m.Model):
        id = m.IntegerField(null=False, unique=True, primary_key=True)
        name = m.CharField(max_length=250, unique=True, null=False)
        bs = m.ManyToManyField(B, through='D')
    
        def __str__(self):
            return '%d, %s, (%s), (%s)' % (
                self.id,
                self.name, 
                ', '.join(b.name for b in self.bs.all()), 
                ', '.join(b.a.name for b in self.bs.all()))
                )
    
       @property
       def all_bs(self):
          return ', '.join([x.name for x in self.bs.all()])
    

    表格类

    class CTable(tables.Table):
    
        class Meta:
             model = C
             fields = ('a', 'b', 'all_bs')
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多