Django查询多个匹配

时间:2014-01-05 06:44:06

标签: 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=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

我想我需要一个返回过滤查询的视图查询,但我不确定如何选择你的具体,因为它不仅仅是一个我可以循环查询的数组。

这些结果也可能有数千条回报,所以我需要最实用的方法。我不希望有人为我写下答案,但指出我正确的方向将是惊人的。

提前感谢任何有帮助的人。

2 个答案:

答案 0 :(得分:2)

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

使用边桌并加入,就像正常一样。在边桌中存储(channel_id, content_id)对。

如果您遇到性能问题,可以选择使用PostgreSQL数组类型字段。因此,您将内容列表存储为uuid[]。这只有在psycopg2和Django的ORM东西可以理解并使用数组时才有用。根据您正在做的事情,数组(而不是关系边表)可能会带来巨大的性能提升,或者性能下降很大。这在很大程度上取决于工作量。

请参阅this related question讨论以逗号分隔的字段。

如果使用数组,则无法正确进行参照完整性检查,无法轻松强制执行唯一性等。此外,当您更新元组的数组字段的一小部分时,整个元组通常会得到因为MVCC而被复制和再次写入。因此,阵列可以产生大的写入放大,其中小的变化会导致大写。

另一方面,使用数组可以改善数据局部性。如果你有主元组,那么获得阵列要快得多。它很可能在TOAST表中进行侧面存储压缩,但它仍然存在于一个地方,不会分散在需要索引扫描,连接和过滤器累积的多个块中。

除非你知道只有一个带有内容列表的边桌,否则你的表现不够好,这就是你应该做的。如果您遇到性能问题,请在查看更改数据模型以使用数组之前,先查看正确的索引,真空等。

答案 1 :(得分:1)

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)

类似的东西......需要更多的工作; - )