django-查询语句

1.model

  • 假设我们的model如下:
  • 某个JobType下有很多Job。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     class JobType(models.Model):
    name = models.CharField(max_length=10)
    description = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
    return self.name

    class Job(models.Model):
    name = models.CharField(max_length=50)
    type = models.ForeignKey(JobType, related_name='jobs')
    city = models.CharField(max_length=30)
    experience = models.CharField(max_length=15)
    education = models.CharField(max_length=10)
    salary = models.CharField(max_length=15)
    public_time = models.DateTimeField()

    def __str__(self):
    return self.name

查询

  • 查询所有JobType

    1
    2
     JobType.objects.all()
    Out[1]: [<JobType: Java>, <JobType: Python>, <JobType: PHP>]
  • 对上述的queryset按名字排序(逆序则在字段前加减号‘-’,如order_by(‘-name’) )

    1
    2
    In [2]: JobType.objects.all().order_by('name')
    Out[2]: [<JobType: Java>, <JobType: PHP>, <JobType: Python>]
  • 查询name为‘Python’的JobType( 注意用get()方法得到的是单个对象而不是queryset,若有多个对象满足条件应该使用filter()方法。)

    1
    2
    In [3]: JobType.objects.get(name='Python')
    Out[3]: <JobType: Python>
  • 注意:1)若get()返回多个对象,会引发异常 MultipleObjectsReturned

  • 2)若没有对象符合查询条件,会引发异常 DoseNotExist,如:

    1
    JobType.objects.get(id=100)  # raises JobType.DoesNotExist
  • 查询所有JobType的name为Python的Job

    1
    2
    3
    4
    5
    In [4]: type = JobType.objects.get(name='Python')

    In [5]: Job.objects.filter(type=type)

    Out[5]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']
  • 由于我们在Job model中定义type外键时,定义了related_name=‘jobs’,故还能用下面的方法查询

    1
    2
    3
    4
    5
    In [6]: type = JobType.objects.get(name='Python') 

    In [7]: type.jobs.all()

    Out[7]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']
  • 当然,我们也可以用一条语句完成这个查询。就是下面的跨表查询,即外键 + 两条下划线 + 另一个表的字段:fk__field-in-foreign-model

    1
    2
    3
    In [8]: Job.objects.filter(type__name='Python')

    Out[8]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']
  • 查询JobType的name为‘Python’之外的所有Job

    1
    2
    3
    In [9]: Job.objects.all().exclude(type__name='Python')

    Out[9]: [<Job: PHP/高级PHP工程师>, <Job: PHP开发工程师>, <Job: PHP>, <Job: PHP开发>, <Job: PHP>, <Job: PHP工程师>, <Job: PHP工程师>, <Job: PHP>, <Job: PHP研发工程师>, <Job: PHP开发工程师>, <Job: PHP>, <Job: PHP>, <Job: PHP开发工程师>, <Job: 高级PHP开发工程师>, <Job: PHP高级工程师>]
  • 转载