django model中的extra()和get_FOO_display

extra

有时候, Django 提供的查询语法不太够用. 为了满足这些边缘需求, Django 提供了 extra() 结果集修改器 - 一种提供额外查询参数的机制.

要注意这些额外的方式对不同的数据库引擎可能存在移植性问题.(因为你在显式的书写SQL语句),除非万不得已,尽量避免这样做:

params

下面描述的所有 额外-SQL 参数都必须是标准 Python 字符串格式(数据库引擎会自动用引号将它引起).``params`` 参数可以包含任意多个的SQL参数.

select

select 关键字参数允许你选择特定的字段. 它是一个字典(属性名与 SQL 语句的映射). 举例来说:

    Poll.objects.extra(
        select={
            'choice_count': 'SELECT COUNT(*) FROM choices WHERE poll_id = polls.id'
        }
    )

每个返回的 ``Poll`` 对象会有一个额外的属性: ``choice_count``, 一个关联`` Choice`` 对象的整数. 注意大多数数据库引擎需要用括号将子查询括起来. Django 的 ``select`` 子句则不需要这个括号.
where / tables
如果你需要传递一个额外的 WHERE 子句 -- 比方进行一个非显式的连接--你可以使用 where 关键字参数. 如果你需要在查询中连接其它的表,你可以传递它们的名字给 tables 参数.
where 和 tables 都接受一个字符串列表作为它们的值.所有的 where 参数都被 "AND" 到其它的查询条件中.

举例来说:

    Poll.objects.filter(
        question__startswith='Who').extra(where=['id IN (3, 4, 5, 20)'])

...翻译成 SQL 语句就是::

    SELECT * FROM polls_polls WHERE question LIKE 'Who%' AND id IN (3, 4, 5, 20);

get_FOO_display

如果一个字段有 choices 选项集事, 这个对象将有一个 get_FOO_display() 方法.这里 FOO 是该字段的名字. 这个方法返回一个 "human-readable" 的字段值. 举例来说, 下面的model中:

GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
class Person:
    name = models.CharField(maxlength=20)
    gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
...每个 Person 实例会拥有一个 get_gender_display() 的方法. 示例:

>>> p = Person(name='John', gender='M')
>>> p.save()
>>> p.gender
'M'
>>> p.get_gender_display()
'Male'
原文地址:https://www.cnblogs.com/goser/p/7388207.html