在django-tables2中有很多人

pir*_*irr 2 python django many-to-many foreign-key-relationship django-tables2

通过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')
Run Code Online (Sandbox Code Playgroud)

来自模型C的django-tables2:

class CTable(tables.Table):

    class Meta:
         model = C
Run Code Online (Sandbox Code Playgroud)

观点:

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

并在c.html中:

...
    {% render_table c_table %}
...
Run Code Online (Sandbox Code Playgroud)

我得到的表只有两列(id,name)而不是四列(id,name,b.name,baname).如何从多个到多个缺少列?对不起我糟糕的英语.

rud*_*dra 6

在模型中添加属性方法并使用表类呈现它,即:

模型类

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()])
Run Code Online (Sandbox Code Playgroud)

表类

class CTable(tables.Table):

    class Meta:
         model = C
         fields = ('a', 'b', 'all_bs')
Run Code Online (Sandbox Code Playgroud)