使用django extra select

时间:2018-03-20 13:48:51

标签: sql django django-queryset

class Seller(object):
    type = ...
    name = ...
    cars = models.ManyToManyField(Car)

class PotentialBuyer(object):
    name = ...
    cars = models.ManyToManyField(Car)

class Car(object):
    extra_field = ...
    extra_field2 = ...

假设我有这样的关系。我想使用extra queryset修饰符来获取当我获取卖家对象时潜在买家已经挑选出的汽车列表。我想查询查询集会是这样的。

def markPending(self)
    return self.extra(select={'pending': 'select images from PotentialBuyer as t ...'})

我怎样才能做到这一点?有没有更好的办法?我可以获取卖家对象和潜在对象并做套装,但我认为让它由数据库处理会更清晰。我正在使用PostgreSQL 9.5。

2 个答案:

答案 0 :(得分:0)

我认为Exists子查询表达式会做你想要的。或者至少它会让你开始走正确的道路。 Docs或者您可能希望使用aggregate to count个数字。

编辑:如果您需要选择完整对象而不是计数,存在或单个实体,请使用Prefetch中的prefetch_related实例。 https://docs.djangoproject.com/en/2.0/ref/models/querysets/#django.db.models.Prefetch

答案 1 :(得分:0)

不完全是答案,但这是我最终得到的解决方案,我对表现感到满意。也许有人可以稍后回答这个问题:

    from api.models import PotentialBuyer
    potentials = PotentialBuyer.objects.filter(owner=user_id, default=True).first().cars.all()
    Car.objects.filter(....).annotate(pending=Case(When(id__in=potentials, then=Value(True)), default=Value(False), output_field=BooleanField()))