我有两个列表,我无法处理我想要做的事情以完成下一步的逻辑。
版本:
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
我想我需要一个返回过滤查询的视图查询,但我不确定如何选择你的具体,因为它不仅仅是一个我可以循环查询的数组。
这些结果也可能有数千条回报,所以我需要最实用的方法。我不希望有人为我写下答案,但指出我正确的方向将是惊人的。
提前感谢任何有帮助的人。
答案 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)
类似的东西......需要更多的工作; - )