【问题标题】:Many-To-Many relationship data from mysql through Python 3.4 and Django 1.8从 mysql 到 Python 3.4 和 Django 1.8 的多对多关系数据
【发布时间】:2016-03-01 21:55:02
【问题描述】:

下面是我的模型。我正在使用 python 3.4 和 django 1.8

class Profile(models.Model):
    pid=models.IntegerField(db_column='pid')
    loc=models.CharField(max_length=100)
    class Meta:
          managed="false"
          db_table="protbl"

class Portfolio(models.Model):
    pfid = models.ManyToManyField(Profile,db_column='pfid')
    portfolio=models.CharField(max_length=100)
    class Meta:
          managed="false"
          db_table="pfotbl"

我想搜索并找到给定投资组合项目的匹配项(一个或多个)。我尝试使用下面的视图,但没有预期的运气。

我的看法是:

match_res = Portfolio.objects.filter(portfolio='portfoliofilter')

- 请指导我实现。

我正在查询集结果本身中查看 json 输出。

[{
    "loc": "Singapore",
    "pid": 10012,
    "portfolio": [{
        "portfolioname": "portfolio1",
        "portfoliorank": "8"
    }]
}, {
    "loc": "Singapore",
    "pid": 10013,
    "portfolio": [{
        "portfolioname": "portfolio2",
        "portfoliorank": "5"
    }]
}

]

使用下面的代码得到了上面的 json 结构,但是 100 万条记录需要超过 5 分钟。

res=list(match_res.values('loc','pid','__portfolioname','__portfoliorank')) 
match_res_d = [] 
for g, items in itertools.groupby(res['parent'], 
            lambda x: (x['loc'], x['pid'])): 
            items = [{k: v for k, v in item.items() 
if k not in ('loc', 'pid')}for item in items] 
            data.append({ 'loc': g[0], 'pid': g[1], 'child': items })

【问题讨论】:

    标签: python django python-3.4 django-1.8


    【解决方案1】:

    认为您在询问如何过滤配置文件以返回具有所选投资组合的配置文件。您可以使用双下划线语法来做到这一点:

    match_res = Profile.objects.filter(portfolio__portfolio='portfoliofilter')
    

    【讨论】:

    • 嗨 Roseman,我已经按照视图逻辑获得了查询集,我试图获得预期的 json 结果 - 为此我使用了迭代器和其他循环概念,但处理数百万个需要花费大量时间记录..你能指导我有最快的方法来实现这个json结果吗?
    • 对不起,我不知道你在问什么。您还没有显示任何迭代器或循环。
    • 我正在查看查询集结果本身中的 json 输出(来自 m-t-m 模型)。
    • 然后你应该显示你当前使用的代码和你从中得到的输出。
    • 以下是我获取上述 json 格式的代码,但完成 100 万条记录需要超过 5 分钟。 res=list(match_res.values('loc','pid','__portfolioname','__portfoliorank,..etc)) match_res_d = [] for g, item in itertools.groupby(res['parent'], lambda x : (x['loc'], x['pid'])): items = [{k: v for k, v in item.items() if k not in ('loc', 'pid')} for项目中的项目] data.append({ 'loc': g[0], 'pid': g[1], 'child': items })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多