首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何过滤嵌套的相关django对象

如何过滤嵌套的相关django对象
EN

Stack Overflow用户
提问于 2016-01-25 13:48:29
回答 1查看 9.4K关注 0票数 7

我有一个应用程序,有很多投资者在相同的轮投资,这属于公司,如下所示。但是,当用户(投资者)登录时,我只希望他能够看到他的投资。

代码语言:javascript
复制
    {
        "id": 1,
        "name": "Technology Company",
        "rounds": [
            {
                "id": 1,
                "kind": "priced round",
                "company": 1,
                "investments": [
                    {
                        "id": 1,
                        "investor": 1,
                        "round": 1,
                        "size": 118000,
                    },
                    {
                        "id": 2,
                        "investor": 2,
                        "round": 1,
                        "size": 183000,
                    },
                ]
            }
        ]
    },

目前,我的视图集是这样扩展get_queryset的:

代码语言:javascript
复制
class CompanyViewSet(viewsets.ModelViewSet):
    def get_queryset(self):
        user = self.request.user
        investor = Investor.objects.get(user=user)
        companies = Company.objects.filter(rounds__investments__investor=investor)
        return companies

它检索属于该投资者的投资,但当它再次利用这些投资来检索轮次时,它会抓住所有投资者的轮子。

我怎样才能让它只向投资者显示下面的投资呢?

以下是我的模型:

代码语言:javascript
复制
class Company(models.Model):
    name = models.CharField(max_length=100)

class Round(PolymorphicModel):
    company = models.ForeignKey(Company, related_name='rounds', blank=True, null=True)

class Investment(PolymorphicModel):
    investor = models.ForeignKey(Investor, related_name='investor')
    size = models.BigIntegerField(default=0)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-25 16:42:32

你对所发生的事情的描述非常不清楚。“当它再次接受这些投资”是什么意思?不管怎样,我猜你需要做的就是使用.prefetch_related和一个Prefetch对象。

代码语言:javascript
复制
from django.db.models import Prefetch

class CompanyViewSet(viewsets.ModelViewSet):
    def get_queryset(self):
        user = self.request.user
        investor = Investor.objects.get(user=user)
        companies = Company.objects.filter(
            rounds__investments__investor_id=investor.id
        ).prefetch_related(Prefetch(
            'rounds__investments',
            queryset=Investment.objects.filter(
                investor_id=investor.pk,
            ),
        ))
        return companies

我还没有测试过这段代码,但它应该会给你一个指向正确方向的指针。我还优化了investor查找,只检查id,这将为您节省不必要的间接性。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34985912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档