具有多个匹配项的Django查询

2024-05-26 11:11:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子,我无法处理我脑子里的逻辑,我该怎么做才能完成下一步。你知道吗

版本:

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)

表格应用程序_频道入口1。内容列表: [u'3e46340c-9601-4183-9ffc-8de01e456686', u'7a413dd3-6aa8-4c49-be20-b6f4366c0801']

表格应用程序_内容.条目1.channelid: 3e46340c-9601-4183-9ffc-8de01e456686

表格应用程序_内容.entry5.channelid: 7a413dd3-6aa8-4c49-be20-b6f4366c0801

我想我需要一个返回过滤查询的视图查询,但是我不知道如何具体地挑选u,因为我可以循环查询的不仅仅是一个数组。你知道吗

而且这些结果可能有成千上万的回报,所以我需要最实用的方法来做这件事。我不指望有人能为我写下答案,但给我指出正确的方向将是惊人的。你知道吗

提前感谢任何帮助你的人。你知道吗


Tags: django版本true应用程序内容modelmodels逻辑
2条回答
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)

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

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

像平常一样,使用边桌并在边桌上连接。在边表中存储(channel_id, content_id)对。你知道吗

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

请参阅this related question,其中讨论逗号分隔字段。你知道吗

如果使用数组,则无法正确执行引用完整性检查、无法轻松强制唯一性等。此外,当更新元组数组字段的一小部分时,由于MVCC,整个元组通常会被复制并再次写入。所以数组可以产生大的写放大,小的变化会导致大的写放大。你知道吗

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

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

相关问题 更多 >