Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:unique_合在一起是否意味着db_index=True,与ForeignKey的含义相同?_Python_Django_Django Models_Database Indexes - Fatal编程技术网

Python Django:unique_合在一起是否意味着db_index=True,与ForeignKey的含义相同?

Python Django:unique_合在一起是否意味着db_index=True,与ForeignKey的含义相同?,python,django,django-models,database-indexes,Python,Django,Django Models,Database Indexes,模型上的字段,foo=models.ForeignKey(foo)将自动为列添加数据库索引,以加快查找速度。这很好,但是Django的文档没有说明模型meta的unique\u中的字段是否接受相同的处理。我碰巧有一个模型,其中一个列在unique\u中的char字段需要一个索引来快速查找。我知道在字段定义中添加重复的db_index=True不会有任何影响,但我很好奇。根据,它只会在数据库级别强制执行唯一性。我认为通常使字段唯一并不意味着它有索引。不过,如果索引存在,也可以简单地检查db级别。所

模型上的字段,
foo=models.ForeignKey(foo)
将自动为列添加数据库索引,以加快查找速度。这很好,但是Django的文档没有说明模型meta的
unique\u中的字段是否接受相同的处理。我碰巧有一个模型,其中一个列在
unique\u中的char字段需要一个索引来快速查找。我知道在字段定义中添加重复的
db_index=True
不会有任何影响,但我很好奇。

根据,它只会在数据库级别强制执行唯一性。我认为通常使字段唯一并不意味着它有索引。不过,如果索引存在,也可以简单地检查db级别。所有内容都表明它没有添加索引。

如果
unique\u together
添加了索引,则它将是一个多列索引


如果希望对其中一列进行单独索引,我认为需要在字段定义中指定
db_index=True

Django 1.5及更高版本中,可以同时使用
{Model}.Meta.index\u
类属性。如果您有两个名为
foo
bar
的字段,您将添加:

class Meta(object):
    index_together = unique_together = [
        ['foo', 'bar']
    ]
如果只有一组唯一字段,则可以将一维iterable一起用于
unique\u
。但是,这并不表示这同样适用于
索引\u一起

这也可以:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = [
        ['foo', 'bar']
    ]
但是,文档不支持这一点:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = 'foo', 'bar'

如果有人想知道,除了要获得索引的性能优势,他们是否还需要一个
unique\u-together
索引,Postgres的答案是,他们是
unique\u-together
不会自动为列表中的每个字段添加索引

Django的新版本建议改用索引和约束元选项:


我问题的“暗示”部分与Django特有的行为有关
models.ForeignKey
默认情况下在字段定义中设置
db_index=True
。我还相信,
unique=True
字段也会创建一个索引(数据库级别),这就是唯一检查如何快速运行(如果我错了,请纠正我)。我认为这取决于数据库引擎如何处理唯一约束。如果我是对的,大多数人都会设置索引。这与Django无关。事实上,
模型.ForeignKey
部分与Django有关,而不是
unique=True
。我提到了
unique=True
作为旁白,因为
使字段唯一并不…
答案的一部分。
unique\u合起来也在数据库级别强制执行,而不是在Django中。假设数据库引擎自动支持唯一列上的索引,则将设置索引。如果不是,那就不是。这就是你的答案。另外,浏览Django的代码并不意味着他们会在一个
unique\u上一起设置db索引,以下是一个来自postgresql控制台的uniquere_toguether索引示例:
public |注册|注册|注册|注册|字段590B3BDB9D08B87C | uniq |创建唯一索引注册590B3BDB9D08B87C |使用btree注册Ɏ字段590B3BDB9D08B87C | uniq(字段1,字段2)
将两个字段一起索引
与相同两个字段的
db\u index=True
不同
index_合在一起
允许您将多个索引合并为1,这样在数据库扫描单个索引时,就可以比较像
中a=5和b=10这样的子句。添加得很好,Tom。谢谢。谢谢你提供更多信息!试图修复断开的链接,但找不到工作链接。你们能,请,修复链接或删除它吗?嘿,好了,谢谢这个新的答案。新的约束API非常棒。我在你的答案上面加了一点直接回答原来的问题,这样我就可以把这个作为新的正确答案,因为它现在更相关了。