2017-02-20 37 views
1

我试图显示在Django-table2的一个M2M字段如在Django-tables2: How to use accessor to bring in foreign columns?Accessing related models with django-tables2Django的表2 M2M字段未示出

看出使用:foreigncolumn = tables.Column(存取= 'foreignmodel.foreigncolumnname') ,我只看到一个“--'...

# The models: 

class Organism(models.Model): 
     species_name = models.CharField(max_length=200) 
     strain_name = models.CharField(max_length=200) 
     eukaryotic = models.BooleanField(default=True) 
     lipids = models.ManyToManyField('Lipid',blank=True) 

class Lipid(models.Model): 
    lm_id = models.CharField(max_length=100) 
    common_name = models.CharField(max_length=100,blank=True) 
    category = models.CharField(max_length=100,blank=True) 

#The tables 

class OrganismTable(tables.Table): 
    name = tables.LinkColumn('catalog:organism-detail', text=lambda record: record.species_name, args=[A('pk')]) 
    lp = tables.Column(accessor='Lipid.common_name') 
    class Meta: 
     model = Organism 
     sequence = ['name','lp'] 
     exclude = ['id','species_name'] 

任何想法,我做错了吗?

+0

首先,您将不得不在存取器字符串中使用“lipids”。那么,你想在那里展示什么?所有与生物体有关的“Lipid”实例的名称? – schwobaseggl

+0

谢谢@schwobaseggl!我已经尝试过使用低分子脂质(脂质,脂质,脂质),但它也无法正常工作....是的,我想显示所有与生物体相关的脂质实例。 –

回答

1

由于Accessor的工作原理简单,这对ManyToManyFields来说并不容易。您可以通过'lipids.all'显示相关QuerySetrepr,但这在这里似乎不够。但是,您可以将属性(或方法)添加到Organism模型中,并在访问器中使用它。通过这种方式,可以显示相关的实例中的任何自定义信息:

class Organism(models.Model): 
    # ... 
    @property 
    def lipid_names(self): 
     return ', '.join(l.common_name for l in self.lipids.all()) # or similar 

class OrganismTable(tables.Table): 
    # ... 
    lp = tables.Column(accessor='lipid_names') 

我会建议再增加一个prefetch_related('lipids')OrganismQuerySet您传递表中有更好的表现。

+0

是的!大!有效!坦克队友!你救了我的一天!实际上在澳大利亚的夜晚!真的很感激,现在我可以去睡觉了! –

+0

有一件事:如果您的表数据不是查询集,而只是一个python列表,那么您只能通过非db-field-columns排序表,因此可能希望将列设置为'orderable = False'或将查询集转换为列表;) – schwobaseggl

相关问题