2016-09-12 3 views
0

나는 django.db.modelsSum와 django_tables2의 사용 사례가 있지만, 나는 그 수 있는지 궁금 집계와 장고 문서를 읽은 후 사용을 알아낼 수 없습니다 :장고-표 2와 장고 주석을 문제

# models.py 
class AModel(models.Model): 
    a_id = models.IntegerField() 
    a_name = models.CharField(max_length=50) 
    def __unicode__(self): 
     return unicode(self.name) 


class BModel(models.Model): 
    b_id = models.IntegerField() 
    b_name = models.CharField(max_length=50) 
    a_name = models.ForeignKey(AModel) 
    def __unicode__(self): 
     return self.b_name 

class CModel(models.Model): 
    c_id = models.IntegerField() 
    c_name = models.CharField(max_length=50) 
    c_status = models.CharField(max_length=8) 
    def __unicode__(self): 
     return self.c_name 

class DModel(models.Model): 
    d_id = models.IntegerField() 
    dmode = models.CharField(max_length=50) 
    bmodel = models.ForeignKey(BModel) 
    cmodel = models.ForeignKey(CModel) 
    date = models.DateField(null=True) 
    cost = models.FloatField(default=0.00) 
    def __unicode__(self): 
     return self.d_name 

# tables.py 
import django_tables2 as tables 
class DmodelTable(tables.Table) 
    class Meta: 
     model = DModel 
     fields = ('dmodel', 'bmodel', 'cmodel', 'cost') 

class TargetTable(tables.Table) 
    a_name = tables.Column(accessor='b_name.a_name') 
    class Meta: 
     model = DModel 
     fields = ('bmodel', 'cmodel', 'amodel', 'cost_sum') 

# view.py 
from django.db.models import Sum 
... 
def page(request): 
    queryset = DModel.objects.values('bmodel','cmodel').annotate(cost_sum=Sum('cost')) 
    table = TargetTable(queryset) 
    return render(request, 'tartget.html', {'table':table}) 

def dmodelpage(request): 
    table = DModelTable(DModel.objects.all()) 
    return render(request, 'tartget.html', {'table':table}) 

    :

    +---------+------------+----------+--------------------+ 
    | b_name | c_name  | a_name | cost_sum   | 
    +---------+------------+----------+--------------------+ 
    | 1863703 | 8485748 | -  |    3150 | 
    | 1863703 | 8688288 | -  |     0 | 
    | 1863703 | 8691184 | -  |    712.5 | 
    

    은 내가 솔루션이 문제가 발생 : 내가 가진 결과는 TargetTable입니다 다음과 같습니다

  1. b_namec_name은 예상되는 이름이 아닌 ID입니다.

  2. a_name은 null입니다. 첫 번째 문제는 bmodel이 queryset에서 bmodel을 올바르게 반환하지 않았기 때문에 bmodel.a_name이 작동하지 않기 때문입니다.

내가 here 언급 같은 DModel에 하나의 외래 키의 표시 "ID"문제에 대한 솔루션을 찾을 수 있지만, mutlti 외국 키 케이스를 처리하는 방법을 모르고을 가질 수 없습니다.

누군가 도움을 줄 수 있습니까? 당신은 self.x_name를 반환하여 모델에 __str__/__unicode__ 방법을 정의 할 필요가 있습니다

답변

0
  1. 대단히 감사합니다. a_name = tables.Column(accessor='b_name.b_name')

+0

안녕하세요, Jieter, 답장을 보내 주셔서 감사합니다. 1. 코드에서 __unicode__을 (를) 가지고 있고, 내 질문에 업데이트하십시오.이 코드는 작동하지 않습니다. 2. 원래의 질문에 "bmodel"이라고 쓰고 있다고 생각했는데 실제로는 Dmodel의 "b_name"값입니다. 혼란스럽게해서 죄송합니다. 그러나 그것은 작동하지 않습니다. – zhihong

+0

파이썬 2 또는 3을 사용합니까? 2를 사용한다면,'__unicode__'가 아닌'__str__'을 추가해야합니다. [django docs (https://docs.djangoproject.com/en/1.10/topics/python3/#str-and-unicode-methods도 참조하십시오.). django 관리자는 올바른 방법을 정의하지 않았다면 이름도 표시하지 않습니다. – Jieter

+0

안녕하세요, Jieter, 저는 Python 2를 사용하고 __ unicode __를 사용합니다. 모든 관리자는 이름을 올바르게 표시하고 다른 테이블은 DModelTable과 같은 이름을 올바르게 표시합니다. 여기의 문제는 TargetTable의 집계 계산과 관련이 있다고 생각합니다. – zhihong

0

모든

  • 사용한다, 그래서 DModel에 당신의 외래 키의 이름은, b_name있다가, 나중에 내가 문제를 파악 :

    # table.py 
    class TargetTable(tables.Table) 
         class Meta: 
          model = DModel 
          fields = ('bmodel__b_name', 'cmodel__c_name', 'cmodel__amodel__a_name', 'cost_sum') 
    
    # view.py 
    from django.db.models import Sum 
    ... 
    def page(request): 
        queryset = DModel.objects.values('bmodel__b_name','cmode__c_name', 'cmode__amode__a_name').annotate(cost_sum=Sum('cost')) 
        table = TargetTable(queryset) 
        return render(request, 'tartget.html', {'table':table}) 
    

    당신이 이름을 표시하려면, 해당 모델의 정확한 필드 이름을 참조해야합니다. .values ​​()에 필요한 모든 aggragation 열을 추가해야합니다.