使用Django Q obj查询返回多个结果的中间模型

2024-10-03 11:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在Q对象中,如何遵循中间“通过”模型

我试图在一个查询中获得id的所有Property对象的列表,这些对象是User的成员

UserBusinessUnitBusinessUnitMember的成员

我如何使用一个Q对象生成一个过滤器,该对象为特定的User查找所有(多个)BusinessUnitMember,然后为这些BusinessUnitMember查找所有(多个)BusinessUnit

class Property(BaseModel):
    """Physical Things belonging to various Business Units"""

    category = models.CharField(max_length=255, choices=CATEGORY_CHOICES)
    objects = PropertyQuerySet.as_manager()

    @property
    def asset(self):
        asset_maps = {
            'typea': 'type_a_asset',
            'typeb': 'type_b_asset',
        }

        if self.category not in asset_maps:
            return None
        return getattr(self, asset_maps.get(self.category), None)


class AssetBase(models.Model):
    """Abstract Base Asset model."""
    business_unit = models.ForeignKey('BusinessUnit', null=True, on_delete=models.SET_NULL)


class TypeAAsset(AssetBase):
    """Type A Assets"""
    property = models.OneToOneField('Property', null=True, on_delete=models.CASCADE,
                                    related_name='type_a_asset')


class TypeBAsset(AssetBase):
    """Type B Assets"""
    property = models.OneToOneField('Property', null=True, on_delete=models.CASCADE,
                                    related_name='type_b_asset')    

class BusinessUnit(models.Model):
    name = models.CharField(max_length=255)
    owner = models.ForeignKey('core.User', null=True,
                              on_delete=models.SET_NULL,
                              related_name='owned_business_units')


class BusinessUnitMember(models.Model):
    """ ``through`` model for BU and members. """
    business_unit = models.ForeignKey('BusinessUnit', on_delete=models.CASCADE)
    member = models.ForeignKey('core.User', on_delete=models.CASCADE)

我需要找到当前User所属的所有Property对象的id

我在想一个过滤器,比如:

available_ids = Property.objects.filter(Q(type_a_asset__business_unit__in=user.businessunitmember.all().businessunit_set.all())).values_list('id', flat=True)

但是

businessunitmember_set.all().businessunit_set.all()

部分不起作用,因为businessunitmember_set.all()返回一个queryset对象,该对象将不具有'businessunit_set'属性。使用businessunitmember_set.get()也不起作用,因为它将返回3个结果,而不是1个

我已经通过对各个模型进行迭代来实现它,但是这些模型当然会创建大量的查询


Tags: 对象selftrueonmodelstypepropertyasset