Python 循环遍历django的实例
models.pyPython 循环遍历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
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}
注意:在执行上述循环之前,您应该定义空的dictsmale
和male
您可以在之后运行此命令,以获得所需的结果:
for k in males:
'Males ' + k + ' ' + str(males[k])
就我而言,结果如下:
'Males HIV 2'
'Males MALARIA 2'
'Males TYPHOID 2'
您可以将其重新制作成一个方法。但它不是递增的。我需要在其中计数also@DGIDGI我更新了答案,如果您使用此代码,它应该可以正常工作,您可以在models.py中将其重新生成为一个方法,并在需要新信息时调用它。