Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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查询_Python_Django_Postgresql 9.3 - Fatal编程技术网

Python 具有多个匹配项的Django查询

Python 具有多个匹配项的Django查询,python,django,postgresql-9.3,Python,Django,Postgresql 9.3,我有两个清单,我无法处理我头脑中关于我应该做什么来完成下一步的逻辑 版本: Django 1.5.4 Python 2.7 PostgreSQL 9.3 型号: class Channel(models.Model): contentlist = models.CharField(null=True,max_length=255555) class Content(models.Model): contentid = UUIDField(unique=True,editable=

我有两个清单,我无法处理我头脑中关于我应该做什么来完成下一步的逻辑

版本:

Django 1.5.4
Python 2.7
PostgreSQL 9.3
型号:

class Channel(models.Model):
   contentlist = models.CharField(null=True,max_length=255555)

class Content(models.Model):
   contentid = UUIDField(unique=True,editable=False)
表app_channel.entry1.contentlist:
[u'3e46340c-9601-4183-9ffc-8de01e456686',u'7a413dd3-6aa8-4c49-be20-b6f4366c0801']

表app_content.entry1.channelid:
3e46340c-9601-4183-9ffc-8de01e456686

表app_content.entry5.channelid:
7a413dd3-6aa8-4c49-be20-b6f4366c0801

我想我需要一个返回过滤查询的视图查询,但我不确定如何特别挑选u,因为它不仅仅是我可以循环查询的数组

此外,这些结果可能有数千个返回,因此我需要最实用的方法来实现这一点。我不希望有人为我写下答案,但为我指出正确的方向将是令人惊讶的


提前感谢所有提供帮助的人。

请不要将列表/数组存储在字符字段中。这是一种真正的痛苦,你现在才开始看到它的开始

像平常一样,使用边桌并在其上连接。在边表中存储成对的
(频道id、内容id)

如果您在这方面存在性能问题,另一种方法是使用PostgreSQL数组类型的字段。因此,您将内容列表存储为
uuid[]
。不过,这只有在psycopg2和Django的ORM thingy能够理解并使用数组时才有用。根据您所做的工作,数组(与关系侧表相反)可能是一个巨大的性能增益,也可能是一个巨大的性能下降。这在很大程度上取决于工作量

请参见讨论逗号分隔字段的内容

如果使用数组,则无法正确执行引用完整性检查,无法轻松实施唯一性等。此外,当更新元组数组字段的一小部分时,由于MVCC,整个元组通常会被复制并再次写入。因此,阵列可以产生大的写放大,而小的更改会导致大的写操作

另一方面,使用数组可以提高数据的局部性。如果您有主元组,那么获取数组的速度要快得多。它很可能被压缩存储在一个TOAST表中,但它仍然在一个地方,不可能分散在多个块中,需要索引扫描、连接和过滤器来累积

除非您知道仅仅拥有一个包含内容id列表的边表对您来说不够好,否则这就是您应该做的。如果您有性能问题,在考虑更改数据模型以使用阵列之前,请先研究适当的索引、真空度等

class Channel(models.Model):
   name = models.CharField()

class Content(models.Model):
   text = models.TextField()
   channel = models.ForeignKey(Channel)

channel = Channel.objects.get(name='foo')
for content in Content.objects.filter(channel=channel):
    print(content.text)

像这样的事。。。需要更多的工作;-)

这是一个相当长的查菲尔德。文本字段可能更合适。或者,如果只是一个uuid列表,也许你会重新考虑架构?@JohnMee就PostgreSQL而言,没有任何区别
text
varchar
都是持有varlena类型的相同文本的别名。Django在乎吗?这是一个独特的UUID,它必须是可伸缩的,因为我说过,一些响应将在数百万个选项中提供1000个有效响应。是否打算在contentlist中找到contentid?因此,创建一个新的模型类,而不是编辑Channel.contentlist,只需编辑相应的表?那么创建数组的查询将从新表中删除吗?在Django中有没有快速处理表关系的方法?或者我必须从一个新表到另一个表内容查询每个contentid以获得其他值吗?(这正是我试图保持轻松的地方)@AndrewWilson我不会说Django,但sunds很可能是对的,是的。至于第二个问题——听起来你只是想加入其中。我不知道如何在Django中加入,但文档会。在SQL中,如果我猜对了您想要的内容,它将类似于
SELECT content.*,channel.*FROM content-internal JOIN channel\u content ON(channel\u content.content\u id=content.content\u id)internal JOIN channel ON(channel.channel\u id=channel\u content.channel\u id)
。这通常被称为“连接表”或“n:m链接表”。谢谢,这正是我想要的答案类型。顺便说一句,如果必须在数据库字段中存储
列表
或其他本机Python对象,则可以在
bytea
字段(
model.BinaryField
)中存储
pickle
'd Python对象。当你这样做的时候,查询是完全无用的,因为SQL代码不能“看到”对象的内部,但是它可以让你存储那些当你陷入困境时很难映射到关系表上的东西。我最终在Django中完成了很多字段关系来完成这项工作。