【问题标题】:how to filter nested related django objects如何过滤嵌套的相关 django 对象
【发布时间】:2016-05-01 08:49:19
【问题描述】:

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

    {
        "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 如下:

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

它检索属于投资者的投资,但是当它再次使用这些投资来检索轮次时,它会与所有投资者一起抢夺轮次。

我怎样才能写出这样它只向投资者显示下面的投资?

这是我的模型:

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)

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    您对所发生情况的描述非常不清楚。 “当它再次进行这些投资时”是什么意思?无论如何,我猜你需要做的是使用.prefetch_relatedPrefetch 对象。

    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
    

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

    【讨论】:

    • 是的,这正是我要找的……谢谢!
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2019-02-14
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多