2014-01-23 2 views
1

МодельПреобразование необработанный SQL Джанго QuerySet API

class Person(models.Model): 
    GENDER = (
    ('M','Male'), 
    ('F','Female'), 
    ) 
    first_name = models.CharField("First Name", max_length=100) 
    last_name = models.CharField("Last Name",max_length=100) 
    middle_name = models.CharField("Middle Name", max_length=100, blank=True) 
    suffix_name = models.ManyToManyField(SuffixName, verbose_name="Suffix Name",null=True, blank=True) 
    gender = models.CharField(max_length=1, choices=GENDER) 
    department = models.ManyToManyField(Department, verbose_name="Department",null=True, blank=True) 

    def __unicode__(self): 
     return (u'%s') % (self.last_name.upper() + ', ' + self.first_name + ' ' + self.middle_name) 

class Department(models.Model): 
    department_desc = models.CharField('Department', max_length=100,unique=True) 
    department_acronym = models.CharField('Department Acronym', max_length=20,blank=True,help_text="Add acronym if any, not required") 
    location = models.CharField('Location',max_length=100,blank=True) 
    localnumber = models.CharField('Local Number',max_length=30,blank=True) 
    active = models.BooleanField('Active',default=True) 

    def __unicode__(self): 
     return self.department_desc 

Как я могу преобразовать это необработанный SQL для запроса Django?

SELECT pp.first_name, pd.department_desc, pd.localnumber 
FROM person_person as pp 
INNER JOIN person_person_department as ppd on pp.id = ppd.person_id 
INNER JOIN person_department as pd on pd.id = ppd.department_id 

ответ

0

Использование QuerySet.values или QuerySet.values_list:

Person.objects.values('first_name', 'department__department_desc', 'department__localnumber') 
# -> Returns a ValuesQuerySet that yields dictionaries when iterated. 

Person.objects.values_list('first_name', 'department__department_desc', 'department__localnumber') 
# -> Returns a ValuesQuerySet that yields tuples when iterated. 
+0

Это было очень быстро! Благодаря! – splucena

0

Получение на Person автоматически загрузит соответствующие объекты, поэтому ваш запрос:

people = Person.objects.all() 

Затем, вы можете сделать следующее:

for person in people: 
    print('Person: {0}'.format(person.first_name)) 
    for dept in person.department_set.all(): 
     print('Desc: {0}, Local Number: {1}'.format(dept.department_desc, 
                dept.localnumber)) 

Если вы хотите ограничить возвращаемые значения, используйте values_list.