我试图用新的Prefetch来解决一个问题,但我不知道如何使用它。
我有这些模型:

class Desk(django.db.models.Model):
    pass

class Chair(django.db.models.Model):
    desk = django.db.models.Foreignkey('Desk', related_name='chair',)
    nearby_desks = django.db.models.ManyToManyField(
        'Desk',
        blank=True,
    )

我想为Desk获取一个queryset,但它还应该包含一个预取属性favorite_or_nearby_chairs,其值应该等于:
Chair.objects.filter(
    (django.db.models.Q(nearby_desks=desk) | django.db.models.Q(desk=desk)),
    some_other_lookup=whatever,
)

这在Prefetch中可能吗?我不知道如何使用这些论点。

最佳答案

不需要使用预取。如果默认的预取相关操作无法完成所需操作,则只需使用预取。

Chair.objects.select_related('desk').prefetch_related('nearby_desks')\
        .filter(Q(nearby_desks=desk) | Q(desk=desk))

更新
使用预取:
nearby_desks_qs = Desk.objects.all()

Chair.objects.select_related('desk')\
    .prefetch_related(Prefetch('nearby_desks',
                               queryset=nearby_desks_qs,
                               to_attr='nearby_desks_qs'))\
    .filter(Q(nearby_desks=desk) | Q(desk=desk))

10-08 04:08