Python 循环遍历django的实例

Python 循环遍历django的实例,python,django,Python,Django,models.py from django.db import models from collections import Counter from django.db.models import Count from itertools import groupby Gender = ( ('Male', 'MALE'), ('Female', 'FEMALE'), ) Diseases = ( ('Cholera', 'CHOLERA'), ('H

models.py

    from django.db import models
from collections import Counter
from django.db.models import Count
from itertools import groupby
Gender = (
    ('Male', 'MALE'),
    ('Female', 'FEMALE'),
)

Diseases = (
    ('Cholera', 'CHOLERA'),
    ('HIV', 'HIV'),
    ('Malaria', 'MALARIA'),
    ('Typhoid', 'TYPHOID'),
    ('Measles', 'MEASLES'),
)


class MyModel(models.Model):
    Gender = models.CharField(max_length=16, choices=Gender, default='MALE')
    Diseases = models.CharField(max_length=16, choices=Diseases, default='MALARIA')
    vote = models.IntegerField(default=0)

    def __str__(self):
            r=0
            return u'%s %s' % (self.Gender, self.Diseases)
现在,它会在AdminDjango面板中返回这个

Male Measles
Male Measles
Male Cholera
Female Cholera
Female Typhoid
Female Typhoid
但我想将其分组,使其看起来像这样:

Male malaria 2
Male Measles 2
Female Typhoid 3 

在这个管理面板中,我建议您阅读django关于创建模型的文档,通过django的python shell查询数据库,以及关于数据库/关系字段之间的关系


对于您的问题,我将创建两个模型:人、疾病

class Person(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=6, choices = GENDER_CHOICES)
    name = models.CharField(max_length=20)
然后是一个疾病模型,因为人们有疾病,而不是相反,我会给疾病模型一个外键person

class Disease(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    DISEASE_CHOICES = (
        ('CHOLERA', 'Cholera'),
        ('HIV', 'HIV'),
        ('MALARIA', 'Malaria'),
        ('TYPHOID', 'Typhoid'),
        ('MEASLES', 'Measles'),
    )
    disease = models.CharField(max_length=20, choices=DISEASE_CHOICES)
为这些模型创建实例后,您可以在python shell中调用它,并获得您想要的结果:

for i in Disease.objects.all():
    if i.person.gender == 'M':
         if i.disease in males:
             males[i.disease] += 1
         else:
             males.update({i.disease:1})
     elif i.person.gender == 'F':
         if i.disease in females:
             females[i.disease] += 1
         else:
             females.update({i.disease:1})
在我的测试用例中,输出是:

>>> males
{'HIV': 2, 'MALARIA': 2, 'TYPHOID': 2}
>>> females
{'HIV': 2}
注意:在执行上述循环之前,您应该定义空的dicts
male
male

您可以在之后运行此命令,以获得所需的结果:

for k in males:
    'Males ' + k + ' ' + str(males[k])
就我而言,结果如下:

'Males HIV 2'
'Males MALARIA 2'
'Males TYPHOID 2'

您可以将其重新制作成一个方法。

但它不是递增的。我需要在其中计数also@DGIDGI我更新了答案,如果您使用此代码,它应该可以正常工作,您可以在models.py中将其重新生成为一个方法,并在需要新信息时调用它。